ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一文带你深入解读面向服务的分布式架构:常见消息中间件产品介绍

2021-06-02 22:00:56  阅读:209  来源: 互联网

标签:架构 Producer 支持 Master RabbitMQ 消息中间件 Consumer RocketMQ 分布式


常见消息中间件产品介绍

没有任何产品是完美的,不同的中间件产品都各有自己的优缺点,最重要的是选择一款适合自己项目的消息中间件产品。

本节将对市面上常见的消息中间件产品做详细的介绍。

Apache ActiveMQ

Apache ActiveMQ支持多种语言客户端(Java、C、C++、C#、Ruby等),支持多种协议(HTTP、TCP、SSL、NIO、UDP等)以及良好的Spring支持。

1.Apache ActiveMQ简介

Apache ActiveMQ是Apache出品的、最流行的、能力强劲的开源消息总线以及支持企业集成模式的服务器。ActiveMQ执行速度快,并且支持跨语言的客户端和协议。ActiveMQ是一个完全支持JMS 1.1和JaveEE 1.4规范的JMS Provider实现。JMS在当今的Java EE应用中间仍然扮演着特殊的角色。

2.ActiveMQ特性

ActiveMQ包含以下特性。

  • 支持跨语言和协议来编写客户端。语言包括Java、C、C++、C#、Ruby、Perl、Python、PHP等。其中支持的协议如下。

  • OpenWire协议:支持Java、C、C++、C#等高性能客户端。

  • Stomp协议:支持使用C、Ruby、Perl、Python、PHP、ActionScript/Flash、Smalltalk等编写客户端。·AMQP v1.0。

  • MQTT v3.1用于链接IoT环境。

  • 完全支持JMS客户端和Message Broker的企业集成模式。

  • 支持高级特性,诸如Message Groups、Virtual Destinations、Wildcards和Composite Destinations。

  • 完全支持JMS 1.1和Java EE 1.4规范的瞬态(Transient)、持久化、XA消息以及事务。

  • 轻松集成至Spring的应用中,并可以使用Spring的XML配置机制。

  • 通过了常见Java EE服务器(如TomEE、Geronimo、JBoss、GlassFish和WebLogic)的测试,其中通过JCA 1.5资源适配器的配置,可以让ActiveMQ自动部署到任何兼容Java EE 1.4的商业服务器上。

  • 支持多种插件化的传送协议——in-VM、TCP、SSL、NIO、UDP、多播、JGroups和JXTA。

  • 支持通过高性能的Journal来让JDBC提供高速的消息持久化。

  • 从设计上保证了高性能的集群、客户端/服务器模式、点对点通信。

  • 支持RESTful API来提供与技术无关、语言无关的基于Web的API通信。

  • 支持Ajax。

  • 支持CXF和Axis,因此ActiveMQ可以很容易地为这两种Web服务栈提供可靠的消息传递。

  • 可以很容易地调用内嵌JMS provider进行单元测试。

RabbitMQ

RabbitMQ用Erlang写成,以高性能、健壮以及可伸缩性著称。

1.RabbitMQ简介

RabbitMQ是由LShift提供的一个AMQP(Advanced MessageQueuing Protocol)的开源实现,用以高性能、健壮以及可伸缩性著称的Erlang写成(因此也继承了这些优点)。

需要注意的是,由于RabbitMQ是运行在Erlang环境中的,所以要确保在RabbitMQ安装前先安装好Erlang。

2.RabbitMQ特点

RabbitMQ具有以下特点。

  • 可靠:RabbitMQ提供了多种功能,让我们可以权衡性能与可靠性,包括持久性、传输确认、发布者证实以及高可用性。

·灵活的路由:消息在到达队列前会通过exchange(消息交换机)进行路由。RabbitMQ将几个内置的exchange类型作为典型的路由逻辑。对于更复杂的路由可以绑定多个exchange,甚至写自己的exchange类型作为插件。

  • 集群:在本地网络上多个RabbitMQ服务器可以聚集一起,形成一个单一逻辑broker。

  • 联邦(Federation):对于需要更加松散和允许比集群服务器更不可靠的连接,RabbitMQ提供了联邦模型(Federation Model)。

  • 高可用的队列:队列可以在多台计算机集群中配置为镜像,确保即使在发生硬件故障的情况下,你的信息仍然是安全的。

  • 多协议:支持在各种消息传递协议中传输消息。比如AMQP 0-9-1、STOMP、MQTT、AMQP 1.0、HTTP等。

  • 多样的客户端:包括了几乎你能想到的任何一种语言的RabbitMQ客户端,例如Java/Spring、.NET、Ruby、Python、PHP、Objective-C/Swift、Node.js、C/C++、Go、Erlang、Haskell、OCaml等。·简单易用的管理界面:基于浏览器的Web管理界面,可以监视和控制消息代理的每一个方面。

  • 跟踪:支持跟踪,方便查找问题。

  • 插件系统:支持多种插件,以及可以编写自己的插件。

  • 商业支持:提供商业支持、培训、咨询。

Apache RocketMQ

当市面上流行的开源项目无法满足自身业务发展的需要时,企业将不得不走上自研道路。RocketMQ的出现也是如此。RocketMQ诞生于阿里巴巴,如今已在全球被广泛采用。

2016年11月,阿里巴巴将RocketMQ捐赠给了Apache基金会进行孵化。从此,RocketMQ“走出国门”,成了更加国际化的一款中间件产品。

1.RocketMQ简介

RocketMQ是阿里巴巴出品的一款低延迟、可靠、可扩展、易于使用的面向消息的中间件,支撑着阿里巴巴集团庞大的消息业务增长。

RocketMQ是基于MetaQ的一个开源分支,几乎重写了MetaQ所有的核心组件,可以说是MetaQ的下一代产品。RocketMQ同时也是阿里云的ONS云消息服务的核心组件,每天可处理上千亿条消息,服务于阿里内部上千个应用,顺利通过了淘宝、天猫“双11”等大促考验。

RocketMQ提供了多种功能。

  • 支持Pub/Sub和P2P消息模型。

  • 在同一个队列中具有可靠的FIFO和严格的通信顺序。

  • 长pull queue模型,也支持push消费方式。

  • 在单个队列中具备堆积上亿条消息的能力。·覆盖多种消息协议,如JMS、MQTT、HTTP2等。

  • 每个消息至少投递一次的消息传递语义(Message DeliverySemantics)来保证分布式部署架构高可用。

  • 支持Docker镜像来进行隔离测试和云隔离集群。

  • 提供用于配置、测量和监控的功能丰富的管理界面。

  • 消息全链路跟踪。

  • 生产者事务消息机制,使得生产者和本地数据库事务能在一个原子操作里面进行处理。

  • 消息调度交付,类似JMS 2规范的延迟交付。

2.RocketMQ物理部署结构

RocketMQ物理部署结构如下图所示。在这里插入图片描述

RocketMQ网络部署特点如下。

  • Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。

  • Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master与Slave的对应关系通过指定相同的BrokerName、不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。

  • Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,并且定时向Master发送心跳。Producer完全无状态,可集群部署。

  • Consumer与Name Server集群中的一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,并且定时向Master、Slave发送心跳。

Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。

3.RocketMQ逻辑部署结构

RocketMQ逻辑部署结构如下图所示。在这里插入图片描述

  • Producer Group:用来表示一个发送消息的应用。一个ProducerGroup下包含多个Producer实例,可以是多台机器,也可以是一台机器的多个进程,或者是一个进程中的多个Producer对象。一个Producer Group可以发送多个Topic消息,Producer Group的作用如下。

  • 标识一类Producer。

  • 可以通过运维工具查询这个发送消息的应用下有多个Producer实例。

  • 发送分布式事务消息时,如果Producer中途意外宕机,Broker会主动回调Producer Group内的任意一台机器来确认事务状态。

  • Consumer Group:用来表示一个消费消息的应用。一个ConsumerGroup下包含多个Consumer实例,可以是多台机器,也可以是多个进程,或者是一个进程的多个Consumer对象。一个Consumer Group下的多个Consumer以均摊方式消费信息,如果设置为广播方式,那么这个Consumer Group下的每个实例都消费全部数据。需要注意的是,同一个Consumer Group中的Consumer实例必须有相同的topic subscription。可以说,Consumer Group的概念,变相地实现了消息领域著名的点对点和广播通信模式。

写在最后

最近我整理了整套《JAVA核心知识点总结》,说实话,作为一 名 Java 程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手offer,点击下面图片↓直达领取

好了,以上就是本文的全部内容了,如果觉得有收获,记得三连,我们下期再见。

标签:架构,Producer,支持,Master,RabbitMQ,消息中间件,Consumer,RocketMQ,分布式
来源: https://blog.csdn.net/m0_58479954/article/details/117484621

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有