首先抄一段解释说明。。。
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构
消息队列的基本概念
- 生产者,发送消息到消息队列即生产消息的上游
- 消费者,接收消息的下游
- 消息队列,生产者产生消息发送给消息队列,消费者从消息队列取出关注的消息进行消费
- topic,即主题,可以供消费者订阅,这样消费者就只取自己关注的消息或者消息队列只将消费者关注的主题相关的消息发送给该消费者
- broker,MQ集群包含多台服务器,其中一台就称为broker
消息传输模型
req/rep(请求答复模式):主要用于远程调用及任务分配等。
pub/sub(订阅模式):主要用于数据分发。
push/pull(管道模式):主要用于多任务并行。
- 要保证数据处理的顺序性
- 传输过程中需要注意的是如何进行负载均衡的分配
- 为防止消息队列的数据堆积需要设置消息的高水位
- 考虑到由于消息堆积或者节点失效可能导致数据丢失,所以需要进行消息的持久化
- 如果需要消息支持事务的话,要支持处理失败的消息回滚
下面以kafka为例加深对消息队列的理解
Kafka设计解析(一)- Kafka背景及架构介绍
读完上面的文章提出几个问题:
- 消息队列即FIFO,一个队列好保证顺序,假如多个队列接收一个producer的消息是怎么保证消息的顺序性的呢?
在发送一条消息时,可以指定这条消息的key,Producer根据这个key和Partition机制来判断应该将这条消息发送到哪个Parition。Paritition机制可以通过指定Producer的paritition. class这一参数来指定,该class必须实现kafka.producer.Partitioner接口。本例中如果key可以被解析为整数则将对应的整数与Partition总数取余,该消息会被发送到该数对应的Partition。(每个Parition都会有个序号,序号从0开始)
- 这里讲了producer到broker进行负载均衡的方式,都有哪些Paritition机制
- consumer以group为单位去pull消息,在group范围内进行负载均衡,这里的负载均衡是怎么做的呢,也是哈希取余吗