为什么使用消息中间件?
我们使用消息中间件是为了实现解耦和缓冲的功能。接下来,以Nsq作为模板理解消息中间件。
-
首先,Nsq消息中间件中引入了一个队列,以购物系统为例,当订单系统创建一个订单后,它会往队列中push一条topic为“create order”(随便定)的消息,之后,Nsq会将队列中消息推送给订阅了相关topic的机器。通过一个队列,实现了各个服务系统之间的解耦和系统缓冲功能。
-
中间件必须做到高效,可靠,方便,才能真正实用。这里就有用到生产者和消费者模式,在kafka中,用消费者组(Comsumer Group)来表示话题下不同的订阅者;而在Nsq中,则是采用channel来表示。Nsq通过channel推送到不同的服务系统。(topic是我们手动创建的,而channel是消费者订阅时自动创建)

-
Nsq通过nsqlookup模块来记录topic,channel及其订阅的消费者。nsqlookup首先会提供一个
/lookup接口,消费者可以通过该接口查询到对应topic的url链接,之后通过链接与nsq进行连接,nsq会收到消息给这些消费者推送消息。 -
最后就是消息中间件必须能够实现集群分布。
总结一下,Nsq几大模块:
- nsq:存储消息的地方,每个topic可以有一个或者多个channel
- nsqlookup:实现服务发现的模块
- nsqadmin:主要进行可视化管理的web ui工具
Nsq中实现细节
- 消息至少被投递一次。如果成功投递,对方会给返回
FIN;否则,返回REQ。超时不响应,nsq也会将消息requeue。 - 重试次数,nsq通过
attempts字段判断重复尝试的次数。 - 消息是无序的
- Nsq中采用push方式推送消息给消费者,保证了实时性。此外Nsq的存储的消息都是在内存中,当超过
memqueue-size设置的值,Nsq会对消息进行持久化,储存到磁盘中。 - Nsq通过
rdy_count字段进行流量控制,判断该字段是否为0是否继续推送消息给消费者。
总结
一个消息中间件必须能够集群,可扩展性要强,性能好,可靠性要高。
消息中间件以下特性考虑:
- 消息投递策略
- 消息时序性
- 消息推送方式(push还是pull)
- 消息存储到内存中还是磁盘中
参考连接