Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 多个kafka生产者设置:消除延迟/过时写入_Apache Kafka - Fatal编程技术网

Apache kafka 多个kafka生产者设置:消除延迟/过时写入

Apache kafka 多个kafka生产者设置:消除延迟/过时写入,apache-kafka,Apache Kafka,我有一个中央数据库,读卡器从中按接收顺序读取数据,然后写入卡夫卡主题。对于弹性,我们有多个读卡器,但一次只能有一个读卡器处于活动状态,因此,事件按接收顺序用卡夫卡编写。读卡器的切换由其订阅的中央数据库决定,如果读卡器在过去n秒内没有响应,它可以切换到其他读卡器以维护SLA 为简单起见,假设每个更改本质上都是文档更改。因此,change1更新Doc1,change2更新Doc2,change3再次更新Doc1,等等,作为每次更改的一部分,您将收到更新的文档 现在考虑下面的场景。在下面的示例中,Dx

我有一个中央数据库,读卡器从中按接收顺序读取数据,然后写入卡夫卡主题。对于弹性,我们有多个读卡器,但一次只能有一个读卡器处于活动状态,因此,事件按接收顺序用卡夫卡编写。读卡器的切换由其订阅的中央数据库决定,如果读卡器在过去n秒内没有响应,它可以切换到其他读卡器以维护SLA

为简单起见,假设每个更改本质上都是文档更改。因此,change1更新Doc1,change2更新Doc2,change3再次更新Doc1,等等,作为每次更改的一部分,您将收到更新的文档

现在考虑下面的场景。在下面的示例中,Dx Vy表示DocX VersionY:

  • 读卡器1成为活动读卡器。
  • Reader1接收D1-V1、D2-V1并提交给卡夫卡。D1-V1,D2-V1确认提交到数据库
  • Reader1现在收到D1-V2、D2-V2,但在提交卡夫卡之前冻结
  • 数据库使Reader2成为活动读卡器。因为它从未从Reader1收到ack,所以它将向Reader2提供相同的更新
  • 现在,Reader2接收D1-V2、D2-V2并提交给卡夫卡。D1-V2,D2-V2确认提交到数据库
  • Reader2接收D1-V3、D2-V3并提交给卡夫卡。D1-V3、D2-V3提交确认到数据库
  • 读取器1返回并写入D1-V1、D2-V1(现在是陈旧数据)
  • 现在,我们有陈腐的数据提交给卡夫卡。我想避免这种情况

    我找不到任何说明卡夫卡制作人有租赁概念的文档,只有制作人有租赁,它才能写入卡夫卡主题(或分区)。或者Etag的任何概念,其中只有在某种Etag匹配成功时(无论是在分区级别、事件键级别等)才可以更改文档。我对卡夫卡还是新手,所以这可能是一个幼稚的问题,正确使用卡夫卡可以避免这种情况。有人能给我指出正确的方向或正确的文档(如果有)来避免类似的事情发生吗


    我查阅了卡夫卡文档,但找不到任何卡夫卡属性可以帮助我处理此场景。我还用谷歌搜索了类似的问题,看看是否有任何现有的答案来解决这个问题。

    查找分布式Sagas@cricket_007我认为这不适用于这里,因为编写卡夫卡更改的读者可能会被卡住足够长的时间,同时,我们需要开始从另一个读者提交更改。因为原始制作人被卡住了,我们无法通过沟通来停止写卡夫卡。另外,由于sla很紧,其他读卡器不能等待太长时间来获得来自原始读卡器的ack。我在想,是否有办法阻止制作人使用卡夫卡集群配置向卡夫卡写入内容?这样,在切换到新的阅读器之前,我们先阻止原制作人。没有办法阻止制作人。。。你说它被卡住是什么意思?制作人可能会被卡住,比如说写入卡夫卡的机器/进程被挂起,然后稍后恢复。在机器/进程挂起的窗口期间,无法与其通信,因此,在恢复时停止向Kafka提交(如果说机器/进程在写入Kafka之前挂起)。仍然不清楚它是如何被卡住的(IO等待?线程死亡?GC时间过长?…这些问题应该在卡夫卡问题的上下文之外解决)。听起来您需要一些外部监控系统,以设置分布式锁,并防止发生其他事情,如果您必须等待生产者做些什么的话