拉取的时机
和Kafka -- 元数据的拉取时机的类似,分为发消息的时候以及定时任务。
拉取的流程
获取topic的时候,先从缓存获取是否有这个topic对应的路由数据,如果有,就直接返回。
如果本地缓存,那需要通过网络请求(Netty)去NameServer获取topic的路由数据。
如果从NameServer拿到topic信息的话,就会把这个topic数据存放在缓存中,以供下次直接取用,避免频繁的拉取。
在放入缓存的时候,还会跟缓存里的数据进行对比,如果跟缓存里不一致,就会更新broker的地址以及MessageQueue(这个后面讲)。
和kafka对比
共同点
- 按需拉取。也就是说,需要哪些topic的信息,就拉取这些topic。所以在定时任务触发拉取元数据消息的时候,会读取内存里有哪些topic信息,根据这些topic的信息去拉取元数据。
- 先判断内存里是否有topic信息,如果有,直接用,如果没有或者不可用去服务端拉取并更新内存。
不同点
- kafka可以批量拉取topic的信息,RocketMQ是一个个topic去拉,性能上比kakfa低。
- kafka的发送消息、拉取元数据是有专门的线程来处理的(发送消息也是这个线程),由于是异步的,所以用休眠-唤醒的模式来通知拉取结果。
- RocketMQ是当前线程处理,会有多线程需要拉取topic信息的情况,需要加锁。
- kafka会对5分钟内不用的topic进行删除,RoeketMQ好像没有??
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。