转载

ActiveMQ、rabbitmq

JMS模型

Java消息服务应用程序结构支持两种模型:

点对点或队列模型

发布/订阅模型

在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:

只有一个消费者将获得消息

生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。

每一个成功处理的消息都由接收者签收

发布者/订阅者模型支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:

多个消费者可以获得消息

在发布者和订阅者之间存在时间依赖性。发布者需要创建一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者创建了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

ActiveMQ

ActiveMQ、rabbitmq

基本组件:

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

ActiveMQ、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之后提供了镜像队列以避免集群节点故障导致的队列内容不可用)(猜测:消息的持久应该包含交换机上的和队列中的,发给所有队列后消息应该可删除了,消费后队列中的可删除了)

    磁盘节点+内存节点,要求集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入火离开集群时,它们必须要将该变更通知到至少一个磁盘节点,如果只有一个磁盘节点,刚好又是该节点崩溃了,那么集群可以继续路由消息,但不能创建队列、创建交换器、创建绑定、添加用户、更改权限、添加或删除集群节点。

原文  https://segmentfault.com/a/1190000019033017
正文到此结束
Loading...