JMS 模型
Java 消息服务应用程序结构支持两种模型:
点对点或队列模型
发布 / 订阅模型
在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:
只有一个消费者将获得消息
生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。
每一个成功处理的消息都由接收者签收
发布者/订阅者模型支持向一个特定的消息主题发布消息。0 或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:
多个消费者可以获得消息
在发布者和订阅者之间存在时间依赖性。发布者需要创建一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者创建了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。
ActiveMQ
基本组件:
Broker,消息代理,表示消息队列服务器实体,接受客户端连接,提供消息通信的核心服务。
Producer,消息生产者,业务的发起方,负责生产消息并传输给 Broker。
Consumer,消息消费者,业务的处理方,负责从 Broker 获取消息并进行业务逻辑处理。
Topic,主题,发布订阅模式下的消息统一汇集地,不同生产者向 Topic 发送消息,由 Broker 分发到不同的订阅者,实现消息的广播。
Queue,队列,点对点模式下特定生产者向特定队列发送消息,消费者订阅特定队列接收消息并进行业务逻辑处理。
Message,消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务 数据,实现消息的传输。
connector(broker 与 client,broker 与 broker)的协议:vm,tcp,xxxx
持久消息的存储:KahaDB(基于文件),journaal+JDBC, 你内存呢,levelDb(leveldb+zk 作为 M - S 复制方案)
集群:
M-S:数据单独 HA 方案共享 + 锁获取 master/slave 切换。leveldb+zk/KahaDB+SAN
类似分片:networkConnector。对于订阅,一直在 brocker 中转发,直到消费。对于 queue 顺序保证比较困难。https://shift-alt-ctrl.iteye….
AMQP
http://docs.oasis-open.org/am…
TYPE – type system and encoding
Transport – AMQP transport layer(全双工可靠递交对等,connection=> 多 channel 的 session=>links)
Messaging – AMQP Messaging Layer (对消息确认,拒绝,持久化等规定)
Transactions – AMQP Transactions Layer(事务提交等)
Security – AMQP Security Layers
rabbitmq
- 组件
Message
消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括 routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。Exchange 类型
Exchange 分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers(基本不用)
Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
Queue
消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
Connection
网络连接,比如一个 TCP 连接。
Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的 TCP 连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /。
Broker
表示消息队列服务器实体。 - 交换机:
1. 直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应绑定键的队列。直连交换机用来处理消息的单播路由(unicast routing)(尽管它也可以处理多播路由)。下边介绍它是如何工作的:
1)将一个队列(一个消费者一个队列)绑定到某个交换机上时,赋予该绑定一个绑定键(Binding Key),假设为 R;
2)当一个携带着路由键(Routing Key)为 R 的消息被发送给直连交换机时,交换机会把它路由给绑定键为 R 的队列
直连交换机的队列通常是循环分发任务给多个消费者(我们称之为轮询)
2. 生产者(P)生产消息 1 将消息 1 推送到 Exchange,由于 Exchange Type=fanout 这时候会遵循 fanout 的规则将消息推送到所有与它绑定 Queue
3.topic - 集群与持久化
rabbitmq 不支持动态扩展,erlang 性能高可以共享 user、vhost、exchange 等,所有的数据和状态都是必须在所有节点上复制的,队列例外,只在单个节点而不是所有节点上创建完整的队列信息(元数据、状态、内容,RabbitMQ 2.6.0 之后提供了镜像队列以避免集群节点故障导致的队列内容不可用)(猜测:消息的持久应该包含交换机上的和队列中的,发给所有队列后消息应该可删除了,消费后队列中的可删除了)
磁盘节点 + 内存节点,要求集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入火离开集群时,它们必须要将该变更通知到至少一个磁盘节点,如果只有一个磁盘节点,刚好又是该节点崩溃了,那么集群可以继续路由消息,但不能创建队列、创建交换器、创建绑定、添加用户、更改权限、添加或删除集群节点。