Kafka Python,如何跟踪从不同过程开始的消费者

时间:2019-04-08 07:04:46

标签: python python-3.x apache-kafka kafka-python

我对Python还是很陌生,刚开始使用Kafka,所以如果我在某个地方写错了,请原谅我的术语。

因此,我有一个基于Django的Web应用程序,我在同一过程中通过Kafka Producer发送json消息。 但是,在务实地创建主题的同时,我还在该主题的单独流程中开始(订阅)新消费者。

#Consumer code snippet

 if topic_name is not None :
        #Create topic
        create_kafka_topic_instance(topic_name)
        #Initialize a consumer and subscribe to topic
        Process(target=init_kafka_consumer_instance, args=(topic_name))

def forgiving_json_deserializer(v):
    if v is None :
        return
    try:
        return json.loads(v.decode('utf-8'))
    except json.decoder.JSONDecodeError:
        import traceback
        print(traceback.format_exc())
        return None

def init_kafka_consumer_instance(topic, group_id=None):
    try:
        if topic is None:
            raise Exception("Invalid argument topic")
        comsumer = None
        comsumer = KafkaConsumer(topic, bootstrap_servers=[KAFKA_BROKER_URL], auto_offset_reset="earliest",
           urn comsumer
    except Exception as e:
        import traceback
        print(traceback.format_exc())
    return Noneurn comsumer
    except Exception as e:
        import traceback
        print(traceback.format_exc())
    return None

生产者代码段

# assuming obj is a model instance
        serialized_obj = serializers.serialize('json', [ order, ])
        #send_message(topic_name,order)
        producer = KafkaProducer(bootstrap_servers=[KAFKA_BROKER_URL], value_serializer=lambda x: json.dumps(x).encode('utf-8'))
        x = producer.send("test", serialized_obj)
        producer.flush()

现在我有一些疑问,因此,如果我的Django应用程序(服务器)以某种方式重新启动,我是否仍可以让使用者继续收听该主题。

我在使用者中也有一些打印语句,这些语句在服务器控制台中看不到。

但是,在python shell中编写相同的代码片段(初始化使用者),我可以在其中看到打印语句中的消息,这意味着我的Producer运行正常。

1 个答案:

答案 0 :(得分:0)

Kafka服务器不取决于您的Django应用程序(服务器)。但是您的消费者是肯定的。

因此您的主题仍然在Kafka服务器中存在(如果kafka服务器死了,则是另一回事了),但是您的使用者将随应用程序一起重新启动。

因此,如果您希望用户使用良好,请使其成为与您的应用程序并行工作的Worker,并且在您的应用程序关闭时不会重新启动