我是使用Spring Boot在kafka中的新手,并且我正在projet工作,我想将使用spring的kafka集成到其中, 因此问题是即使 kafka服务器未运行(离线模式)
,我也希望将消息从生产者发送到消费者任何人都可以举个例子说明如何在离线模式下使用kafka, 我找不到这个主题的主题 我想停止我的kafka服务器(例如),同时生产者想将数据发送到主题,那么消费者可以获得这些消息吗? 最佳解决方案是什么?是真的吗?
*将数据发送到文件中,然后当服务器恢复运行时(例如,我测试连接),我将数据从文件中导出到主题中
*将数据发送到数据库,并且当服务器返回运行状态(测试连接)时,我同样将消息(数据)从数据库发送到我的主题
*使用队列或列表存储消息,并在服务器返回运行状态(测试连接)时,我将列表中的数据发送到主题,但问题是我有很多消息
->如果还有其他简单示例的解决方案,有人可以帮助我吗?
这是brocker Redis 的示例,我们测试了Redis brocker与生产者之间的连接,如果连接失败,我会将数据存储在 Queue 内,该队列可以存储许多消息并且,当Redis和生产者之间的连接恢复工作时,生产者现在可以从队列中获取这些消息,并将其发送给Redis Brocker。
但是这个布罗克的问题是,有一些信息丢失了 因此我们决定将kafka brocker集成到我的项目中,而不是Redis brocker!
任何人都可以在Java中给我一个例子,在生产者将它们发送到kafka集群之前,如何存储大量消息?或者由于我们不想使用相同的Queue解决方案,此问题的最佳解决方案是什么? >
在python中的此示例是如何在连接失败的情况下将消息存储在队列中:
try:
urllib.request.urlopen('http://serverAdress', timeout=0.1)
r.publish(topicProduction,json_background_of_message1)
print(json_background_of_message1)
arretControle=Tru
except Exception as e:
qArret.put(json_background_of_message1)
print("arret")
arretControle=True
// json_background_of_message1是一个队列,如果连接失败,我们可以在发送这些消息之前在此队列中存储很多消息
答案 0 :(得分:0)
Kafka被设计为高度可用的消息传递系统。正确配置,并根据复制因素,您可以一次将多个代理完全关闭几天,并且群集仍可以工作(尽管可能在较高的负载下)。一旦成功部署,我与之合作过的每个Kafka生产集群都不会完全崩溃。我们曾经让个别经纪人破产,有时有时候要几天,但这绝对不是问题。
如果Kafka不可用,建议您使用备用或备用方法。但是,您仍然有同样的问题。如果将消息转储到文件,磁盘空间用完要多长时间?如果您将消息存储在数据库中,那么数据库空间用完要多长时间?如果您将消息存储在内存中的队列中,那么直到内存用完并导致应用程序崩溃为止需要多长时间?现在,您还必须建立一种从卡夫卡停机中恢复的机制,这会增加复杂性和开销。
Kafka的最佳方法是对其进行配置并将其作为高度可用的系统进行处理,正确配置警报和指标,这样,如果出现问题,您将立即收到警报并可以迅速做出反应。另外,您应该始终调整应用程序的大小并对其进行测试,以便有足够的空间来处理最坏的情况。如果将其配置为使用复制因子3,则将能够丢失任何两个代理,并且群集仍将能够正常运行而不会丢失数据。
现在,在应用程序方面,万一Kafka不可用,您的行为应取决于消息的重要性。如果您可以容忍丢失的消息,那么如果生产者返回异常,则将其丢弃,并记录/发送警报。但是,如果它们是非常重要的记录,那么在完全确认它们已保存在Kafka中之前,您不应该在上游系统(无论记录来自何处)上确认/提交消息。为此,我建议将生产者Ack设置为-1
或all
,在失败的情况下进行多次重试,并在producer.send()
方法上设置适当的回调方法。有关更多详细说明,请参见此处:https://kafka.apache.org/21/javadoc/index.html?org/apache/kafka/clients/producer/Callback.html
如其他人所述,有关更多详细信息,请阅读官方文档:https://kafka.apache.org/documentation/