我正在使用Kafka 0.9 new Consumer API。
我让Kafka负责消费者的抵消。我让消费者在同一主题的多台机器上运行。
我试图找出以下内容:
我认为消费者群体 - 消费者关系将存储在ZooKeeper中。我在ZooKeeper中看到了消费者节点,它没有孩子。
通过查看代码,我可以看到的偏差正在写入kafka,但我不知道他们写的是什么主题?
答案 0 :(得分:2)
似乎至少有两种类型的键值对存储在__consumer_offsets主题@nautilus指出。
据我所知,Kafka使用自己的架构和序列化。您可以通过GroupMetadataManager.OFFSET_COMMIT_VALUE_SCHEMA_V0
查看有关这些结构的更多信息:
GroupMetadataManager.GROUP_METADATA_KEY_SCHEMA
GroupMetadataManager.GROUP_METADATA_VALUE_SCHEMA_V0
class UploadPhoto(APIView):
#authentication_classes = (TokenAuthentication,)
permission_classes = ()#(IsAuthenticated,)
def put(self, request, username):
user = User.objects.get(username = username)
userprofile = UserProfile.objects.get(user= user)
photo = PhotoSerializer(userprofile,data = request.data)
photo.is_valid(raise_exception=True)
photo.save()
return Response(status= status.HTTP_200_OK)
答案 1 :(得分:1)
正如@hba所提到的,编码/解码的细节可以在底部附近的kafka.coordinator.GroupMetadataManager
找到。查找readMessageKey
以及以下两种方法。基本上,你需要的是一系列调用,如
import org.apache.kafka.common.protocol.types.Type;
...
ByteBuffer bb = ByteBuffer.wrap(consumerRecord.key())
short version = bb.getShort();
String group = (String)Type.String.read(bb);
String topic = (String)Type.String.read(bb);
int partition = (int)Type.INT32.read(bb);
好消息是org.apache.kafka.common.protocol.types.Type
是Java api的一部分,独立于主要的Jar。丑陋的部分是,上面的代码片段不完整。每个consumerRecord.key()
和consumerRecord.value()
都有两个版本,一个版本必须模仿上述方法的解码。没什么大不了的,只是有点单调乏味。
如果您的项目可以依赖于scala-jar,完整的kafka-jar和Kafka所需的一两个罐子,您也可以使用GroupMetadataManager.readMessageKey(bb)
和其他两种方法来阅读关键和价值。至少在0.9.0.1公开。
答案 2 :(得分:0)
如果由kafka处理的偏移量未存储在zookeeper中,则它存储在主题调用中,并且#_; consumer_offsets - #"在kafka-logs文件夹中。
如果您需要有关使用者组的更多信息,请检查bin / kafka-consumer-groups.sh
,当您执行poll()时,可以通过检查KafkaRecords中的偏移字段来查找每个使用者的偏移量。希望它有帮助!