我们开始在后端重新开发中使用kafka,并且有一个关于如何构造我们产生和消费的消息的快速问题。
假设我们有一个用户微服务来处理用户的crud操作。作为一种可能性提出的两种结构是:
1) 四个Kafka主题,每个操作一个。消息值只包含执行操作所需的数据,即。
topic: user_created
message value: {
firstName: 'john'
surname: 'smith'
}
topic: user_deleted
message value: c73035d0-6dea-46d2-91b8-d557d708eeb1 // A UUID
and so on
2) 与用户相关的事件的单个主题,消息上的属性描述要采取的操作以及所需的数据,即。
// User created
topic: user_events
message value: {
type: 'user_created',
payload: {
firstName: 'john'
surname: 'smith'
}
}
// User deleted
topic: user_events
message value: {
type: 'user_deleted',
payload: c73035d0-6dea-46d2-91b8-d557d708eeb1 // A UUID
}
我赞成所描述的第一种体系,尽管我对Kafka的经验不足使我无法有力地论证原因。我们将非常重视来自更有经验的用户的任何意见。
4条答案
按热度按时间sy5wg1nm1#
我最近研究过这种建筑。
我们使用了一个api网关,它是与前端通信的webservice(在我们的例子中是reactjs)。这个api网关使用rest协议。用springboot开发的微服务在一个单独的线程中充当生产者和消费者。
1-生成消息:向kafka broker发送主题为“producer\u topic”的消息
2-消费信息:收听Kafka关于“消费主题”的信息
对于消费,有一个处理传入消息的线程池和侦听kafka流并将消息处理分配给池中的线程的执行服务。
最底层是一个dao微服务,它处理kafka消息并执行crud操作。
消息格式看起来很像你的第二种方法。
这就是为什么我应该向你推荐第二种方法。当您仅用一个主题处理所有crud操作时,复杂性会降低。由于分区并行性,它的速度非常快,您可以添加复制以提高容错性。
从非物质化和关注点分离的Angular 来看,第一种方法听起来不错,但它并没有真正的可伸缩性。例如,假设您想添加额外的操作,这是另一个要添加的主题。还要看复制。你将有更多的复制品要做,这是相当糟糕的,我想。
owfi6suc2#
kafka0.11添加了消息头,这是一种为消息体指示不同消息类型的简单方法,即使它们都使用相同的序列化程序。
https://cwiki.apache.org/confluence/display/kafka/kip-82+-+add+record+headers
wixjitnu3#
按照tom的建议,请记住,即使使用单个主题,也可以选择使用多个分区来实现用户可伸缩性。kafka提供分区级别的排序,而不是主题级别的排序。这意味着您应该使用一个“键”来标识您正在创建、删除、更新的资源,以便使与此“键”相关的消息始终位于同一分区中,因此如果顺序正确,否则即使使用单个主题,您也可能会失去在不同分区上发送消息的顺序。
mklgxw1f4#
Kafka消息没有与之关联的类型。
对于每个事件类型一个主题,您将不得不担心从不同主题读取的同一实体的事件顺序。仅出于这个原因,我建议将所有事件放在同一个主题中。这样,客户机只需要使用一个主题就可以完全跟踪每个实体的状态。