消息队列有哪些 消息队列( 七 )


kafka会均匀的将一个partition的所有replica分布在不同的机器上 , 从而提高容错性 。
如果某个broker宕机了也没事 , 它上面的partition在其他机器上都有副本的 , 如果这上面有某个partition的leader , 那么此时会重新选举一个新的leader出来 , 大家继续读写那个新的leader即可 。这就有所谓的高可用性了 。
写数据的时候 , 生产者就写leader , 然后leader将数据落地写本地磁盘 , 接着其他follower自己主动从leader来pull数据 。一旦所有follower同步好数据了 , 就会发送ack给leader , leader收到所有follower的ack之后 , 就会返回写成功的消息给生产者 。
消息丢失会出现在三个环节 , 分别是生产者、mq中间件、消费者:
RabbitMQ
Kafka
大体和RabbitMQ相同 。
Rabbitmq
需要保证顺序的消息投递到同一个queue中 , 这个queue只能有一个consumer , 如果需要提升性能 , 可以用内存队列做排队 , 然后分发给底层不同的worker来处理 。
Kafka
写入一个partition中的数据一定是有序的 。生产者在写的时候  , 可以指定一个key , 比如指定订单id作为key , 这个订单相关数据一定会被分发到一个partition中去 。消费者从partition中取出数据的时候也一定是有序的 , 把每个数据放入对应的一个内存队列 , 一个partition中有几条相关数据就用几个内存队列 , 消费者开启多个线程 , 每个线程处理一个内存队列 。
消息队列概念 消息本质上是一种数据结构(当然 , 对象也可以看做是一种特殊的消息) , 它包含消费者与服务双方都能识别的数据 , 这些数据需要在不同的进程(机器)之间进行传递 , 并可能会被多个完全不同的客户端消费
队列(Queue)  , 是先进先出(FIFO, First-In-First-Out)的线性表 , 通俗的讲队列就是一群人或者事物按照排好的顺序等待接受服务或者处理
本地队列按照功能可划分为初始化队列 , 传输队列 , 目标队列和死信队列 。初始化队列用作消息触发功能 。传输队列只是暂存待传的消息 , 条件许可的情况下 , 通过管道将消息传送到其他的队列管理器 。目标队列是消息的目的地 , 可以长期存放消息 。如果消息不能送达目标队列 , 也不能再路由出去 , 则被自动放入死信队列保存 。
只是一个队列定义 , 用来指定远端队列管理器的队列 。使用了远程队列 , 程序就不需要知道目标队列的位置 。
模型队列定义了一套本地队列的属性结合 , 一旦打开模型队列 , 队列管理器会按照这些属性动态地创建出一个本地队列 。
MQ全称(Message Queue)又名 消息队列  , 是一种 异步通讯 的 中间件。可以将它理解成邮局 , 发送者将消息传递到邮局 , 然后由邮局帮我们发送给具体的消息接收者(消费者) , 具体发送过程与时间我们无需关心 , 它也不会干扰我进行其它事情 。
它被广泛的应用与跨平台、跨系统的分布式系统之间 , 为它们提供高效可靠的异步传输机制
JMS(JAVA Message Service,java消息服务)是java的消息服务 JMS是一套 API,是j2EE标准的一部分 。
JMS是由Sun公司早期提出的消息标准 , 旨在为java应用提供统一的消息操作 , 包括create、send、receive等
JMS是Java Enterprise Edition的一部分 。从使用角度看 , JMS和JDBC担任差不多的角色 , 用户都是根据相应的接口可以和实现了JMS的服务进行通信 , 进行相关的操作
结构图
说明
使用 队列(Queue) 作为消息通信载体;满足 生产者与消费者模式  , 一条消息只能被一个消费者使用 , 未被消费的消息在队列中保留直到被消费或超时 。比如:我们生产者发送100条消息的话 , 两个消费者来消费一般情况下两个消费者会按照消息发送的顺序各自消费一半(也就是你一个我一个的消费 。)
结构图
说明
发布订阅模型(Pub/Sub) 使用 主题(Topic) 作为消息通信载体 , 类似于 广播模式 ;发布者发布一条消息 , 该消息通过主题传递给所有的订阅者 ,  在一条消息广播之后才订阅的用户则是收不到该条消息的。

秒懂生活扩展阅读