Java消息服务应用程序结构支持两种模型:
点对点或队列模型
发布/订阅模型
在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:
只有一个消费者将获得消息
生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。
每一个成功处理的消息都由接收者签收
发布者/订阅者模型支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:
多个消费者可以获得消息
在发布者和订阅者之间存在时间依赖性。发布者需要创建一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者创建了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。
基本组件:
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....
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
可以共享 user、vhost、exchange等,所有的数据和状态都是必须在所有节点上复制的,队列例外,只在单个节点而不是所有节点上创建完整的队列信息(元数据、状态、内容,RabbitMQ 2.6.0之后提供了镜像队列以避免集群节点故障导致的队列内容不可用)(猜测:消息的持久应该包含交换机上的和队列中的,发给所有队列后消息应该可删除了,消费后队列中的可删除了)
磁盘节点+内存节点,要求集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入火离开集群时,它们必须要将该变更通知到至少一个磁盘节点,如果只有一个磁盘节点,刚好又是该节点崩溃了,那么集群可以继续路由消息,但不能创建队列、创建交换器、创建绑定、添加用户、更改权限、添加或删除集群节点。