个人笔记

RocketMQ笔记

2018-05-10  本文已影响5人  fanyank

写在前面

本文参考OSChinarocketMQ官方文档整理而成,我也是初学rocketMQ,欢迎各位在评论区指正,
转载请注明来源

rocketMQ架构

转自OSChina

NameServer

可集群,一台NameServer挂掉之后,另一台顶上充当路由表作用,各个NameServer之间没有直接关联,broker集群发送心跳包同时向NameServer集群中的每一个节点发送(意味着各个节点的路由表是实时同步的)
1.主要功能:

producer

  1. 工作机制:
    producer定期从NameServer获取可用的Topic路由信息,并缓存至本地,包括可用的broker列表。当 producer需要发送消息时根据路由表选择一个broker,根据某种发送策略将消息发送至该broker中。如果NamerServer挂掉,producer就使用本地的路由表查找broker,如果在NameServer挂掉的情况下重启producer,那么就没有路由信息,也就无法发送消息了。
    生产者将产生的消息投递到对应的broker上,生产者是无状态的,不可以集群,但可以分组(一个组只允许一个producer实例存在)
  2. 发送方式:
  1. 发送状态:
  1. 关于消息重复发送(Duplication)和消息丢失
    如果获得的sendResult是 FLUSH_DISK_TIMEOUT或者FLUSH_SLAVE_TIMEOUT,那么就意味着broker在那一时刻可能停止运行了,此时有两种做法:1. 什么也不做 2. 消息重发
  2. 超时
    producer发送完消息直到broker返回响应中间等待的时间如果超出等待时间(默认为3秒,支持自定义),会抛出Remoting TimeoutException。并不建议将等待时间调的过短,因为broker需要将消息写入磁盘或者与从从服务器进行同步,

consumer

通过NameServer拿到路由表并缓存至本地
消费者,并发的从消息队列中取消息,随之而来的问题就是消息的顺序问题(比如必须要创建订单之后,才能确认订单,最后支付订单),rocketMQ完美支持消息顺序问题。
消费者也可以成组,但是一组必须订阅相同的topic。

  1. 获取消息的方式:
  1. MessageListener
  1. Consume Status
  1. ConsumeFromWhere
    当一个新的Consumer被加入后,它需要根据如下策略选择性的消费
  1. 重复消费的问题
    出现场景:

broker

broker负责存储队列信息,维护消费进度,定时向NameServer上报topic路由信息。

  1. 配置策略:
    ASYNC_MASTER with SLAVE:可以容忍消息丢失,但要保证broker的高可用
    SYNC_MASTER with SLAVE:强制主从服务器同步刷新,这样做会丢失相当一部分性能,但是换来的是消息的绝对可靠性(不会丢失消息)
    ASYNC_MASTER:适合简单上手
  2. 容错机制:
    如果一台broker挂掉,那么producer不会立即感知,而是NameServer发现该broker心跳超时的时候,会将该broker从broker集群中清除并且告知相应的producer该broker已经挂掉,那么producer会重新选择一个broker;如果在broker挂掉这一段时间内producer已经发送消息给broker,由于producer内部有重试机制(如果发送到某个broker失败,那么会重新选择新的broker发送),最终消息还是会发送到一个新的broker上,不会造成消息的丢失。
  3. 磁盘刷新类型:

Topic

producer产生的每个消息都必须指明该消息的Topic,consumer消费消息时就是通过查路由表找到对应的broker来获取消息的。
一个Topic可以被多个consumer group所消费

上一篇 下一篇

猜你喜欢

热点阅读