我有一个架构,我们有两个独立的应用程序。原始源是一个sql数据库。App1监听CDC表以跟踪对该数据库中表的更改,对这些更改进行规范化和序列化。它将这些序列化的消息发送到Kafka主题。App2监听该主题,将消息调整为不同的格式,并通过HTTP将调整后的消息发送到各自的目的地。
所以我们的流媒体架构看起来像:
SQL(CDC事件)-
我们希望在失败的情况下添加错误处理,并且不能容忍重复事件、丢失事件或更改顺序。鉴于上述架构,我们真正关心的是精确一次适用于从App1获取到App2的消息(我们单独的生产者和消费者)
我正在阅读的所有内容,以及我发现的每一个事务api示例都指向“流”。Kafka流媒体api似乎适用于从Kafka主题获取输入、进行处理并将其输出到另一个Kafka主题的单个应用程序,这似乎不适用于我们对Kafka的使用。以下是Confluent的文档节选:
现在,流处理只不过是对Kafka主题的读-处理-写操作;消费者从Kafka主题中读取消息,一些处理逻辑转换这些消息或修改处理器维护的状态,生产者将生成的消息写入另一个Kafka主题。只需一次流处理就是只需执行一次读-处理-写操作的能力。在这种情况下,“获得正确答案”意味着不会丢失任何输入消息或产生任何重复输出。这是用户期望从一次流处理器中获得的行为。
我正在努力思考如何在我们的Kafka主题中使用精确一次,或者Kafka的精确一次是否是为非“流”用例构建的。我们必须构建自己的消重和容错吗?
如果您使用的是Kafka的Streams API(或另一个支持Kafka一次处理的工具),那么Kafka的一次处理语义(EOS)将在应用程序中涵盖:
topic A --> App 1 --> topic B --> App 2 --> topic C
在您的用例中,一个问题是初始CDC步骤是否也支持EOS。换句话说,你必须问这样一个问题:EOS涉及哪些步骤?EOS是否涵盖了所有步骤?
在下面的示例中,如果(且仅当)初始CDC步骤也支持EOS,则EOS支持端到端,就像其他数据流一样。
SQL --CDC--> topic A --> App 1 --> topic B --> App 2 --> topic C
如果在CDC步骤中使用Kafka Connect,则必须检查所使用的连接器是否支持EOS是或否。
我正在阅读的所有内容以及我发现的每一个事务性api示例都指向“流式传输”。
Kafka生产者/消费者客户端的事务API提供了EOS处理的原语。位于生产者/消费者客户端之上的Kafka Streams使用此功能来实现EOS,开发人员只需几行代码即可轻松使用它(例如当应用程序需要执行聚合或连接等有状态操作时自动处理状态管理)。也许生产者/消费者之间的关系
当然,在开发应用程序时,也可以通过使用底层的Kafka生产者和消费者客户端(带有事务性API)来“构建自己的”,但这需要更多的工作。
我正在努力思考如何在我们的Kafka主题中使用精确一次,或者Kafka的精确一次是否是为非“流”用例构建的。我们必须构建自己的消重和容错吗?
不确定“非流”用例是什么意思。如果你的意思是,“如果我们不想使用Kafka Streams或KSQL(或其他可以从Kafka读取数据以处理数据的现有工具),我们需要做什么才能在应用程序中实现EOS?”,然后答案是“是的,在这种情况下,你必须直接使用Kafka制作人/客户机,并确保你对他们所做的一切都正确地实现EOS处理。”(由于后者很难实现,这一EOS功能被添加到Kafka流中。)
我希望这能有所帮助。
我是一个新的Kafka流,我想阅读一个主题,并在一个新的主题中使用Kafka流API写它的一部分。我的键是string,值是Avro有文档/示例可以使用吗? 编辑: 在分题中,我有: 如何在新主题中添加Body中的其他字段?示例: {“id”:“145”,“timestamp”:1552585938545,“week”:“\u0000”,“source”:{“string”:“tmp”},“bod
问题内容: 因此,以某种方式(玩转),我发现自己使用了regex这样的正则表达式。 从逻辑上讲,对我来说,它应表示: (一个数字正好一次)正好两次,即一个数字正好两次。 但实际上,它似乎仅表示“一个数字仅一次”(因此忽略了)。 使用或相似,可以看到相似的结果。 为什么会这样?它是在regex / Java文档中的某个地方明确声明的,还是只是Java开发人员即时做出的决定,还是一个错误? 还是实际上
我们有一个应用程序,它使用来自Kafka主题(3个分区)的消息,丰富数据,并将记录保存在DB(Spring JPA)中,然后将消息发布到另一个Kafka主题(在同一个代理上),所有这些都通过使用Camel 2.4.1和Spring Boot 2.1.7进行编排。释放 我们想为 kafka 消费者-生产者组合实现“exactly-once”语义。 消费者设置: 生产者设置: 豆接线: 骆驼路线: 但
我正在将tomcat服务器从tomcat7升级到Tomcat8。但Struts1.1似乎不能在Tomcat8上工作。有人知道Tomcat8不支持Struts1.1吗。 下面是堆栈跟踪
问题内容: 我有一个表,其中包含三个带有一些记录的字段。如果用户要编辑表中的记录,则不允许其他用户同时编辑该记录。我可以采取什么样的步骤来实现这一目标? 问题答案: 来自桌面应用程序背景的许多人会想知道如何在Web应用程序中完成此操作。 锁定记录标志 在桌面环境中,一种方法是在该行上具有一个布尔值列,以指示其正在被编辑以及由谁编辑。您当然可以使用Web应用程序执行此操作,但这是一种非常糟糕的方法,
问题内容: 正如前面所讨论的,确认电子邮件应该有一个独特的,(几乎)未猜测的代码- 基本上是一个一次性密码 --in确认链接。 UUID.randomUUID()文档说: 使用加密强度高的伪随机数生成器生成UUID。 这是否意味着在正确实现的JVM中的UUID随机生成器适合用作唯一的(实际上)不可猜测的OTP? 问题答案: 否。 根据UUID规范: 不要以为UUID很难猜测;例如,它们不应用作安全