消息队列由哪些角色组成?
-
生产者(Producer):负责产生消息。
-
消费者(Consumer):负责消费消息
-
消息代理(Message Broker):负责存储消息和转发消息两件事情。其中,转发消息分为推送和拉取两种方式。
-
拉取(Pull),是指 Consumer 主动从 Message Broker 获取消息
-
推送(Push),是指 Message Broker主动将 Consumer 感兴趣的消息推送给 Consumer 。
-
消息队列的使用场景?
-
异步处理:消息队列可以将消息的发送和接收解耦,使得消息的发送者和接收者可以异步处理。这样可以提高系统的并发性能和吞吐量,同时减少系统的耦合性。
-
流量控制:消息队列可以通过控制消息的发送速率,保护系统免受突发流量的冲击,避免系统崩溃或者服务不可用的情况。
-
应用解耦:消息队列可以将不同应用之间的依赖关系解耦,降低应用之间的耦合度。例如,当一个应用需要调用其他应用的服务时,可以使用消息队列来传递请求和响应,避免直接依赖其他应用。
-
延迟处理:消息队列可以将消息缓存到队列中,等待消费者进行消费,从而实现延迟处理。
-
错峰处理:消息队列可以将高峰期的请求缓存到队列中,通过控制消息的发送速率,使得系统能够平滑处理请求,避免系统负载过高导致的服务不可用。
-
日志处理:消息队列可以用于收集分布式系统的日志信息,将日志信息发送到队列中,并由专门的日志处理模块进行处理和分析。
消息队列有几种消息语义?
消息队列中常见的消息语义包括以下几种:
-
最多一次(At most once):这种语义确保消息最多被消费一次。当消息被发送到队列时,消费者将尝试消费该消息。如果消费者成功处理消息并确认消费完成,消息将被认为已被消费。然而,如果在处理期间发生错误,消费者可能无法确认消费完成,导致消息丢失。在这种情况下,消息不会被重传。
-
最少一次(At least once):这种语义确保消息至少被消费一次。当消息被发送到队列时,消费者将尝试消费该消息。如果消费者成功处理消息并确认消费完成,消息将被认为已被消费。如果在处理期间发生错误,消费者可以重新尝试消费消息,直到成功为止。这确保了消息不会丢失,但可能会导致消息被重复消费。
-
只有一次(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操作步骤;
-
数据迁移、扩容对用户透明;
-
无需停机即可扩展机器;
-
其他特性:严格的消息顺序、丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、定期删除机制;