浅谈消息队列

消息队列由哪些角色组成?

  • 生产者(Producer):负责产生消息。

  • 消费者(Consumer):负责消费消息

  • 消息代理(Message Broker):负责存储消息和转发消息两件事情。其中,转发消息分为推送和拉取两种方式。

    • 拉取(Pull),是指 Consumer 主动从 Message Broker 获取消息

    • 推送(Push),是指 Message Broker主动将 Consumer 感兴趣的消息推送给 Consumer 。

消息队列的使用场景?

  1. 异步处理:消息队列可以将消息的发送和接收解耦,使得消息的发送者和接收者可以异步处理。这样可以提高系统的并发性能和吞吐量,同时减少系统的耦合性。

  2. 流量控制:消息队列可以通过控制消息的发送速率,保护系统免受突发流量的冲击,避免系统崩溃或者服务不可用的情况。

  3. 应用解耦:消息队列可以将不同应用之间的依赖关系解耦,降低应用之间的耦合度。例如,当一个应用需要调用其他应用的服务时,可以使用消息队列来传递请求和响应,避免直接依赖其他应用。

  4. 延迟处理:消息队列可以将消息缓存到队列中,等待消费者进行消费,从而实现延迟处理。

  5. 错峰处理:消息队列可以将高峰期的请求缓存到队列中,通过控制消息的发送速率,使得系统能够平滑处理请求,避免系统负载过高导致的服务不可用。

  6. 日志处理:消息队列可以用于收集分布式系统的日志信息,将日志信息发送到队列中,并由专门的日志处理模块进行处理和分析。

消息队列有几种消息语义?

消息队列中常见的消息语义包括以下几种:

  1. 最多一次(At most once):这种语义确保消息最多被消费一次。当消息被发送到队列时,消费者将尝试消费该消息。如果消费者成功处理消息并确认消费完成,消息将被认为已被消费。然而,如果在处理期间发生错误,消费者可能无法确认消费完成,导致消息丢失。在这种情况下,消息不会被重传。

  2. 最少一次(At least once):这种语义确保消息至少被消费一次。当消息被发送到队列时,消费者将尝试消费该消息。如果消费者成功处理消息并确认消费完成,消息将被认为已被消费。如果在处理期间发生错误,消费者可以重新尝试消费消息,直到成功为止。这确保了消息不会丢失,但可能会导致消息被重复消费。

  3. 只有一次(Only once):这种语义确保每条消息只被传递一次,不会丢失也不会重复。实现确切一次语义是相对复杂的,需要使用一些机制来保证消息的幂等性和去重。常见的实现方式包括使用消息唯一标识符、事务性消息和去重机制等。

常见的消息队列

1、RabbitMQ

RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。

主要特性:

  • 可靠性: 提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制;

  • 灵活的路由: 消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用;

  • 消息集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用;

  • 队列高可用:队列可以在集群中的机器上进行镜像,以确保在硬件问题下还保证消息安全;

  • 多种协议的支持:支持多种消息队列协议;服务器端用Erlang语言编写,支持只要是你能想到的所有编程语言;

  • 管理界面: RabbitMQ有一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面;

  • 跟踪机制:如果消息异常,RabbitMQ提供消息跟踪机制,使用者可以找出发生了什么;

  • 插件机制:提供了许多插件,来从多方面进行扩展,也可以编写自己的插件;

2、ActiveMQ

ActiveMQ是由Apache出品,ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。

主要特性:

  • 服从 JMS 规范:JMS 规范提供了良好的标准和保证,包括:同步或异步的消息分发,一次和仅一次的消息分发,消息接收和订阅等等。遵从 JMS 规范的好处在于,不论使用什么 JMS 实现提供者,这些基础特性都是可用的;

  • 连接性:ActiveMQ 提供了广泛的连接选项,支持的协议有:HTTP/S,IP 多播,SSL,STOMP,TCP,UDP,XMPP等等。对众多协议的支持让 ActiveMQ 拥有了很好的灵活性。

  • 支持的协议种类多:OpenWire、STOMP、REST、XMPP、AMQP ;

  • 持久化插件和安全插件:ActiveMQ 提供了多种持久化选择。而且,ActiveMQ 的安全性也可以完全依据用户需求进行自定义鉴权和授权;

  • 支持的客户端语言种类多:除了 Java 之外,还有:C/C++,.NET,Perl,PHP,Python,Ruby;

  • 代理集群:多个 ActiveMQ 代理可以组成一个集群来提供服务;

  • 异常简单的管理:ActiveMQ 是以开发者思维被设计的。所以,它并不需要专门的管理员,因为它提供了简单又使用的管理特性。有很多中方法可以监控 ActiveMQ 不同层面的数据,

  • 包括使用在 JConsole 或者 ActiveMQ 的Web Console 中使用 JMX,通过处理 JMX 的告警消息,通过使用命令行脚本,甚至可以通过监控各种类型的日志。

3、RocketMQ

RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进,消息可靠性上比 Kafka 更好。RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。

  • 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点;

  • Producer、Consumer、队列都可以分布式;

  • Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应的所有队列,如果做集群消费,

  • 则多个Consumer实例平均消费这个topic对应的队列集合;

  • 能够保证严格的消息顺序;

  • 提供丰富的消息拉取模式;

  • 高效的订阅者水平扩展能力;

  • 实时的消息订阅机制;

  • 亿级消息堆积能力;

  • 较少的依赖;

4、Kafka

Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),,之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

  • 快速持久化,可以在O(1)的系统开销下进行消息持久化;

  • 高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;

  • .完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;

  • 支持同步和异步复制两种HA;

  • 支持数据批量发送和拉取;

  • zero-copy:减少IO操作步骤;

  • 数据迁移、扩容对用户透明;

  • 无需停机即可扩展机器;

  • 其他特性:严格的消息顺序、丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制;

相关推荐
Chan161 天前
从生产到消费:Kafka 核心原理与实战指南
java·spring boot·分布式·spring·java-ee·kafka·消息队列
茶杯梦轩8 天前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
初次攀爬者9 天前
Kafka 基础介绍
spring boot·kafka·消息队列
初次攀爬者9 天前
RocketMQ 消息可靠性保障与堆积处理
后端·消息队列·rocketmq
初次攀爬者10 天前
RocketMQ 集群介绍
后端·消息队列·rocketmq
初次攀爬者10 天前
RocketMQ 基础学习
后端·消息队列·rocketmq
初次攀爬者11 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
DemonAvenger13 天前
Kafka性能调优:从参数配置到硬件选择的全方位指南
性能优化·kafka·消息队列
Javatutouhouduan15 天前
RocketMQ是怎么保存偏移量的?
java·消息队列·rocketmq·java面试·消息中间件·后端开发·java程序员
DemonAvenger15 天前
深入理解Kafka分区策略:实现数据均衡分布的最佳实践
性能优化·kafka·消息队列