消息中间件
分布式消息中间件设计
-
是什么
利用高效可靠的消息传递机制进行平台无关的数据交流;
并基于数据通信来进行分布式系统的集成;
通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信;
-
应用场景
跨系统数据传递、高并发流量削峰、数据异步处理、解藕等
-
本质
一种具备接收请求、保存数据、发送数据等功能的网络应用。
-
核心组成
-
协议
-
协议三要素
- 语法:数据与控制信息的结构或格式
- 语义:需要发现何种控制信息,完成何种动作以及做出何种响应;
- 时序:事件实现顺序的详细说明
-
AMQP协议
-
特性
事务支持、持久化支持,出生金融行业,在可靠性消息处理上具备天然的优势。
-
-
MQTT协议
-
特性
轻量、结构简单、传输快、没有事务支持、没有持久化相关设计
-
应用场景
适用于计算能力有限、低带宽、网络不稳定的场景。
-
-
Open Message协议
-
特性
结构简单、解析快、有事务设计、有持久化设计
-
-
Kafka协议
-
特性
结构简单、解析快、无事务设计、有持久化设计
-
-
-
持久化机制
ActiveMQ RabbitMQ Kafka RocketMQ 文件系统 支持 支持 支持 支持 数据库 支持 / / / -
消息分发机制
ActiveMQ RabbitMQ Kafka RocketMQ 发布订阅 支持 支持 支持 支持 轮询分发 支持 支持 支持 / 公平分发 / 支持 支持 / 重发 支持 支持 / 支持 消息拉取 / 支持 支持 支持 -
高可用设计
要能够集群部署来达到高可用的目的。
-
高可靠设计
-
消息传输可靠
通过协议来保证系统间数据解析的正确性
-
消息存储可靠
通过持久化来保证消息的存储可靠性
-
-
ActiveMQ
-
JMS:Java Message Service
- JMS对象模型
- ConnectionFactory
- Connection
- Session
- Destination
- MessageProducer
- MessageConsumer
- Message
- Broker
- JMS消息模型
- 点对点
- 主题(发布订阅)
- JMS消息结构
- 消息头
- 消息属性
- 消息体
- BytesMessage
- MapMessage
- ObjectMessage
- StreamMessage
- TextMessage
- JMS对象模型
-
ActiveMQ的特性
- 支持多种编程语言
- 支持多种传输协议
- TCP
- SSL
- NIO
- nio
- mqtt+nio
- nio+ssl
- UDP
- HTTP(s)
- VM
- AUTO
- 默认TCP
- auto+ssl
- auto+nio
- auto+nio+ssl
- OpenWire:
- TCP
- SSL
- UDP
- NIO
- VM:虚拟机协议
- AMQP
- Stomp
- MQTT
- Peer、Multicast、Failover、Fanout、Discovery、ZeroConf等
- 有多种持久化方式
-
ActiveMQ服务操作
systemctl start activemq #启动ActiveMQ服务 systemctl status activemq #查看服务状态 ln -s /usr/lib/systemd/system/activemq.service /etc/systemd/system/multi-user.target.wants/activemq.service systemctl enable activemq #设置开机自动启动 firewall-cmd --zone=public --add-port=8161/tcp --permanent #防火墙开启8161端口 systemctl restart firewalld.service #重启防火墙
-
ActiveMQ高可用集群方案
- Master-Slave部署方式
- Broker-Cluster部署方式
- Master-Slave与Broker-Cluster相结合的部署方式
-
持久化
JDBC、AMQ、KahaDB和LevelDB
RabbitMQ
-
是什么
一个开源的AMQP实现,服务端采用Erlang语言编写
-
端口
-
4369
是Erlang的端口/结点名称映射程序,用来跟踪节点名称监听地址,在集群中起到一个类似DNS的作用
-
5672、5671
AMQP 0-9-1和客户端端口,没有使用SSL和使用SSL的端口
-
25672
用于RabbitMQ节点间和CLI工具通信,配合4369使用。
-
15672
HTTP_API端口,管理员用户才能访问,用于管理RabbitMQ,需要启用management插件
-
61613、61614
当STOMP插件启用的时候打开,作为STOMP客户端端口(根据是否使用TLS选择)
-
1883、8883
当MQTT插件启用的时候打开,作为MQTT客户端端口(根据是否使用TLS选择)
-
15674
基于WebSocket的STOMP客户端端口(当插件Web STOMP启用的时候打开)
-
15675
基于WebSocket的MQTT客户端端口(当插件Web MQTT启用的时候打开)
-
-
RabbitMQ角色
none、management、policymaker、monitoring、administrator
-
AMQP是什么
Advanced Message Queuing Protocol高级消息队列协议
-
AMQP结构
-
Module Layer
定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑。
-
Session Layer
负责将客户端的命令发送给服务器,再将服务端的应答返回给客户端,主要为客户端与服务端之间的通信提供可靠性同步机制和错误处理。
-
Transport Layer
主要传输二进制数据流,提供帧的处理、信道复用、错误检测和数据表示等
-
-
RabbitMQ概念
-
Producer
-
Broker
-
Virtual Host
-
Channel
-
RoutingKey
-
Exchange
-
Queue
-
Binding
-
Exchange
-
fanout:扇型交换机
它会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中
-
direct:直连交换机
它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中
-
topic:主题交换机
与direct类似,但它可以通过通配符进行模糊匹配
-
headers:头交换机
根据发送的消息内容中的headers属性进行匹配
-
-
Consumer
-
-
RabbitMQ持久化机制
- 队列持久化
- 消息持久化
- 交换器持久化
-
RabbitMQ消息可靠性
-
发送可靠性
确保消息成功发送到Broker
-
存储可靠性
Broker对消息持久化,确保消息不丢失
-
消息可靠性
确保消息成功被消费
-
网友评论