核心点:数据结构的差异
- rabbit 是队列
- kafka 的数据存储是一种追加模式的事物日志
顺序性、消息留存:
rabbit无法保证broker存储数据的有序性,队列是先入先出,消费者消费了,数据就出对了,这个数据就被删除。 假如多个消费者消费同一队列时,某一消费者消费失败,数据回退到队列了,但其他消费者却已经消费成功了。这个时候顺序就乱了,针对顺序性要求高的业务就不支持了。
因为有一个特性:消费者1消费某条数据时,不会阻碍其他消费者消费后面的数据
kafka:针对topic分区保证顺序性,因为其数据不会丢失(除非超时),Kafka 仅仅把它当做消息日志来看待,并不关心消费者的消费状态。消费者可以不限次数的消费每条消息,并且他们可以操作分区偏移来“及时”往返的处理这些消息。
容错性:重试
RabbitMQ 可以配置重试次数。
在 RabbitMQ 中我们需要记住最重要的事情是当一个消费者正在处理或者重试某个消息时(即使是在把它返回队列之前),其他消费者都可以并发的处理这个消息之后的其他消息。
当某个消费者在重试处理某条消息时,作为一个整体的消息处理逻辑不会被阻塞。
和 RabbitMQ 相反,Kafka 没有提供这种开箱即用的机制。在 Kafka 中,需要我们自己在应用层提供和实现消息重试机制。
我们需要注意的是当一个消费者正在同步地处理一个特定的消息时,那么同在这个分区上的其他消息是没法被处理的。
由于消费者不能改变消息的顺序,所以我们不能够拒绝和重试一个特定的消息以及提交一个在这个消息之后的消息。你只要记住,分区仅仅是一个追加模式的日志。
即:如果消费者阻塞在重试一个消息上,那么底部分区的消息就不会被处理。