消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。
在现代云架构中,应用程序被分解为多个规模较小且更易于开发、部署和维护的独立构建块。消息队列可为这些分布式应用程序提供通信和协调。
消息队列可以显著简化分离应用程序的编码,同时提高性能、可靠性和可扩展性。此外,您还可以采用扇出设计模式将消息队列与发布/订阅消息收发结合起来。
1.提高性能 消息队列支持异步通信,这意味着创建和处理消息的终端节点将与队列进行交互,而不是彼此交互。创建器可以将请求添加到队列中,无需再等待这些请求接受处理。处理器仅在消息可用时才会处理消息。系统中的任何组件都不会停下等待其他组件,从而优化了数据流。
2.增强可靠性 队列可永久保留您的数据,并减少系统的不同部件离线时发生的错误。通过利用消息队列分离不同的组件,可以提高容错性。即使系统的某一部分无法访问,其他部分也仍可继续与队列进行交互。队列本身也可以进行镜像,以提供更高的可用性。
3.可拓展性 消息队列可根据您的需要精确扩展。当工作负载到达峰值时,应用程序的多个实例都可以将请求添加到队列,而且不会产生冲突。随着队列因这些传入请求的增多而越来越长,您可以将这些工作负载分发给一组处理器。创建器、处理器和队列本身都可以按需扩展和缩减。
4.分离解耦 消息队列消除了组件之间的依赖关系,并显著简化了分离应用程序的编码。软件组件不必承担通信代码的重压,而是可以在经过设计后执行离散的业务功能。
无论您使用的是整体式应用程序、微服务还是无服务器架构,消息队列都是一种简单且出色的应用程序分离方法。
官网: http://www.rabbitmq.com/ 开发语言: Erlang 支持客户端语言言: Erlang,java,Ruby等 协议: AMQP, STOMP, XMPP, SMTP 消息推拉模式: pull/push均支持 数据可靠性: 保证数据不丢,有Slave用作备份 单机吞吐量: 万级 持久化能力: 内存, 文件
RabbitMQ是一个消息传递代理—消息传递的中介。它为您的应用程序提供了一个发送和接收消息的公共平台,并为您的消息提供了一个安全的地方,直到收到消息为止。它的特性包括可靠性、高可用性、集群和联合。RabbitMQ附带一个易于使用的管理UI,允许您监视和控制消息代理的各个方面。几乎任何您能想到的语言都有RabbitMQ客户机。
官网: https://rocketmq.incubator.apache.org/ 开发语言: Java 支持客户端语言: Java, C++, Go 协议: JMS,MQTT 消息推拉模式: pull/push均支持 数据可靠性: 支持异步实时刷盘,同步刷盘,同步复制,异步复制 单机吞吐量:十万级 持久化能力: 磁盘文件
其中
NameServer: 为 producer 和 consumer 提供路由信息 Producer: 为消息生产者,生产者的作用就是将消息发送到MQ,生产者本身既可以产生消息 Consumer: 为消息消费者,消费 MQ 上的消息的应用程序就是消费者 Broker: RocketMQ系统的主要角色,及队列。Broker接收来自生产者的消息,储存以及为消费者拉取消息的请求做好准备。
Apache RocketMQ是一个低延迟、可靠、可伸缩、易于使用的消息中间件,诞生于阿里巴巴庞大的消息业务。它提供的各种功能如下:
官网: http://activemq.apache.org/ 开发语言: Java 支持客户端语言: Java, .NET, C++ 等 协议: OpenWire, STOMP, REST, XMPP, AMQP 消息推拉模式: pull/push均支持 数据可靠性: master/slave 单机吞吐量:万级 持久化能力: 内存, 文件, 数据库
p2p模式:
pub/sub模式:
Apache ActiveMQ是最流行、功能最强大的开源消息传递和集成模式提供者。Apache ActiveMQ速度快,支持许多跨语言客户机和协议,具有易于使用的企业集成模式和许多高级特性,同时完全支持JMS 1.1和J2EE 1.4。
官网: http://kafka.apache.org/ 开发语言: Java & Scala 支持客户端语言: Java, Scala 等 协议:自有协议 消息推拉模式: pull 数据可靠性: 数据可靠,并有replication机制,有容错容灾能力 单机吞吐量:十万级 持久化能力: 磁盘文件,可以做到无限消息堆积
内部结构图:
如上图所示,一个典型的kafka集群中包含若干producer,若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个Zookeeper 集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。
喜欢可以关注公众号: 终身幼稚园