浅谈消息队列

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

  • 生产者(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操作步骤;

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

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

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

相关推荐
码农爱java1 天前
Kafka 之消息并发消费
spring boot·微服务·kafka·mq·消息中间件·并发消费
码农爱java2 天前
Kafka 之顺序消息
spring boot·分布式·微服务·kafka·mq·消息中间件·顺序消息
Java 第一深情3 天前
RabbitMQ最全教程-Part1(基础使用)
分布式·消息队列·rabbitmq
ktkiko114 天前
Java中消息队列——ActiveMQ、RabbitMQ、RocketMQ、Kafka
java·消息队列
码农爱java6 天前
Kafka 之消息广播消费
spring boot·微服务·kafka·mq·消息中间件·广播消息
码农爱java8 天前
Kafka 客户端工具使用分享【offsetexplorer】
spring boot·分布式·微服务·中间件·kafka·mq·offset explorer
太阳伞下的阿呆8 天前
kafka-clients之mq丢失问题
分布式·kafka·mq·可靠性
ok你也是个coder9 天前
Kafka 基础入门
分布式·kafka·mq·kafka入门
确实可以10 天前
7.使用Redis进行秒杀优化
redis·消息队列·go
极客先躯12 天前
高级java每日一道面试题-2024年10月19日-消息队列[RabbitMQ]-RabbitMQ中积压了大量的消息,如何处理?
java·消息队列·rabbitmq·java-rabbitmq·积压大量消息·队列积压·java高级