我想改变从REST到Kafka的(微)服务之间的通信。 我不确定这些主题,并希望听到一些意见。
考虑以下设置: 我有一个API网关,通过REST为Web应用程序提供CRUD功能。所以我有4个用户可以调用的端点。 API网关将生成请求并使用来自第二个服务的响应。 第二个服务使用请求,访问数据库以对数据库执行CRUD操作并生成结果。
我应该创建多少个主题? 我是否必须创建8(每个端点2个(请求/响应))或者有更好的方法吗?
希望听到一些经验或与会谈/文件相关的链接。
答案 0 :(得分:5)
这个问题的简短回答是;这取决于你的设计。
您只能为所有操作使用一个主题,或者您可以将多个主题用于不同的操作。但是你必须知道;
您必须按照创建的顺序向kafka发送消息,并且必须按相同的顺序使用消息以提供一致性。发送到kafka的消息在主题分区中排序。 kafka不会对不同主题分区中的消息进行排序。可以说,您创建了一个项目,然后删除了该项目。如果在与create operation相关的消息之前尝试使用与delete操作相关的消息,则会出现错误。在这种情况下,您必须将这两个消息发送到同一主题分区,以确保在创建消息后消耗删除消息。
请注意,始终存在一致性和吞吐量之间的交易。在这种情况下,如果您使用单个主题分区并将所有邮件发送到同一主题分区,则会提供一致性,但您无法快速使用邮件。因为您将逐个从同一主题分区获取消息,并且在上一条消息消耗时您将收到下一条消息。要在此处增加吞吐量,您可以使用多个主题,也可以将主题划分为多个分区。对于这两种解决方案,您必须在生产者端实现一些逻辑以提供一致性。您必须将相关消息发送到同一主题分区。例如,您可以将主题划分为不同实体类型的数量,并将相同实体类型crud操作的消息发送到同一分区。我不知道它是否确保您的方案的一致性,但这可以是另一种选择。您应该找到提供与多个主题或主题分区一致性的逻辑。这取决于你的情况。如果您可以找到逻辑,则可以提供一致性和吞吐量。
对于您的情况,我将使用具有多个分区的单个主题,而在生产者方面,我会将相关消息发送到同一主题分区。
- 问候