RocketMQ|RocketMQ -- 元数据的拉取

拉取的时机 和Kafka -- 元数据的拉取时机的类似,分为发消息的时候以及定时任务。
拉取的流程 【RocketMQ|RocketMQ -- 元数据的拉取】获取topic的时候,先从缓存获取是否有这个topic对应的路由数据,如果有,就直接返回。
RocketMQ|RocketMQ -- 元数据的拉取
文章图片

如果本地缓存,那需要通过网络请求(Netty)去NameServer获取topic的路由数据。
如果从NameServer拿到topic信息的话,就会把这个topic数据存放在缓存中,以供下次直接取用,避免频繁的拉取。
RocketMQ|RocketMQ -- 元数据的拉取
文章图片

在放入缓存的时候,还会跟缓存里的数据进行对比,如果跟缓存里不一致,就会更新broker的地址以及MessageQueue(这个后面讲)。
和kafka对比 Kafka -- 元数据的拉取流程
共同点

  1. 按需拉取。也就是说,需要哪些topic的信息,就拉取这些topic。所以在定时任务触发拉取元数据消息的时候,会读取内存里有哪些topic信息,根据这些topic的信息去拉取元数据。
  2. 先判断内存里是否有topic信息,如果有,直接用,如果没有或者不可用去服务端拉取并更新内存。
不同点
  1. kafka可以批量拉取topic的信息,RocketMQ是一个个topic去拉,性能上比kakfa低。
  2. kafka的发送消息、拉取元数据是有专门的线程来处理的(发送消息也是这个线程),由于是异步的,所以用休眠-唤醒的模式来通知拉取结果。
  3. RocketMQ是当前线程处理,会有多线程需要拉取topic信息的情况,需要加锁。
  4. kafka会对5分钟内不用的topic进行删除,RoeketMQ好像没有??

    推荐阅读