游龙战神|「事件驱动架构」何时使用RabbitMQ或 Kafka?( 二 )


在RabbitMQ中 , 消息被存储起来 , 直到接收应用程序连接并接收到队列外的消息 。 客户端可以在接收到消息或在完全处理完消息后ack(确认)消息 。 在任何一种情况下 , 一旦消息被处理 , 它就会从队列中删除 。
如果您在Kafka中使用重播 , 请确保您使用它的方式和原因是正确的 。 将一个事件重复播放多次 , 而这个事件应该只发生一次;例如 , 如果您碰巧多次保存客户订单 , 在大多数使用场景中并不理想 。 当用户中存在需要部署新版本的bug , 并且需要重新处理部分或全部消息时 , 重播就会派上用场了 。
协议我还提到了“RabbitMQ支持一些标准化协议 , 如AMQP, MQTT, STOMP等” , 其中它本机实现AMQP 0.9.1 。 使用标准化消息协议允许您将RabbitMQ代理替换为任何基于AMQP的代理 。
Kafka在TCP/IP之上使用自定义协议在应用程序和集群之间进行通信 。 Kafka不能被简单地移除和替换 , 因为它是唯一实现这个协议的软件 。
RabbitMQ支持不同协议的能力意味着它可以在许多不同的场景中使用 。
AMQP的最新版本与官方支持的0.9.1版本有很大不同 。 RabbitMQ不太可能偏离AMQP 0.9.1 。 该协议的1.0版本于2011年10月30日发布 , 但尚未获得开发人员的广泛支持 。 AMQP 1.0可通过插件使用 。
路由答案的下一部分是关于路由的 , 我写道:“Kafka有一个非常简单的路由方法 。 如果你需要以复杂的方式将消息传递给用户 , RabbitMQ有更好的选择 。 ”
RabbitMQ的主要优点是能够灵活地路由消息 。 直接或基于正则表达式的路由允许消息到达特定队列 , 而无需附加代码 。 RabbitMQ有四种不同的路由选择:直接、主题、扇出和头交换 。 直接交换路由消息到所有队列 , 这些队列与所谓的路由密钥完全匹配 。 扇形交换器可以向绑定到该交换器的每个队列广播一条消息 。 topics方法类似于direct , 因为它使用一个路由键 , 但是允许通配符匹配和精确匹配 。 有关不同交换类型的更多信息可以在这里找到 。
Kafka不支持路由;Kafka主题被划分为多个分区 , 这些分区以不变的顺序包含消息 。 您可以使用消费者组和持久主题来替代RabbitMQ中的路由 , 在该路由中 , 您将所有消息发送到一个主题 , 但让您的消费者组从不同的偏移量订阅 。
您可以在Kafka streams的帮助下自己创建动态路由 , 即动态地将事件路由到主题 , 但这不是默认特性 。
游龙战神|「事件驱动架构」何时使用RabbitMQ或 Kafka?消息优先级RabbitMQ支持所谓的优先队列 , 这意味着队列可以被设置为具有一系列优先级 。 可以在发布消息时设置每个消息的优先级 。 根据消息的优先级 , 它被放置在适当的优先级队列中 。 那么 , 什么时候可以使用优先队列呢?下面是一个简单的示例:我们每天都在为托管的数据库服务ElephantSQL运行数据库备份 。 数以千计的备份事件被无序地添加到RabbitMQ中 。 客户还可以按需触发备份 , 如果发生这种情况 , 我将一个新的备份事件添加到队列中 , 但具有更高的优先级 。
在卡夫卡中 , 消息不能以优先级发送 , 也不能按优先级顺序发送 。 无论客户端有多忙 , Kafka中的所有消息都按照接收它们的顺序存储和发送 。
确认(提交或确认)“确认”是在通信进程之间传递的信号 , 表示确认 。, 接收发送或处理的信息 。
Kafka和RabbitMQ都支持生产者确认(RabbitMQ中的发布者确认) , 以确保发布的消息已安全到达代理 。
当节点向使用者传递消息时 , 它必须决定是否应将该消息视为由使用者处理(或至少是接收) 。 客户端可以在接收到消息时或在客户端完全处理完消息后进行ack 。
RabbitMQ可以考虑发送出去的消息 , 也可以等待使用者在收到消息后手动确认 。