消息中间件学习记录1

Nsq学习笔记1

Posted by Reborn on November 16, 2018

为什么使用消息中间件?

我们使用消息中间件是为了实现解耦和缓冲的功能。接下来,以Nsq作为模板理解消息中间件。

  1. 首先,Nsq消息中间件中引入了一个队列,以购物系统为例,当订单系统创建一个订单后,它会往队列中push一条topic为“create order”(随便定)的消息,之后,Nsq会将队列中消息推送给订阅了相关topic的机器。通过一个队列,实现了各个服务系统之间的解耦和系统缓冲功能。

  2. 中间件必须做到高效可靠方便,才能真正实用。这里就有用到生产者和消费者模式,在kafka中,用消费者组(Comsumer Group)来表示话题下不同的订阅者;而在Nsq中,则是采用channel来表示。Nsq通过channel推送到不同的服务系统。(topic是我们手动创建的,而channel是消费者订阅时自动创建

  3. Nsq通过nsqlookup模块来记录topic,channel及其订阅的消费者。nsqlookup首先会提供一个/lookup接口,消费者可以通过该接口查询到对应topic的url链接,之后通过链接与nsq进行连接,nsq会收到消息给这些消费者推送消息。

  4. 最后就是消息中间件必须能够实现集群分布。

总结一下,Nsq几大模块:

  • nsq:存储消息的地方,每个topic可以有一个或者多个channel
  • nsqlookup:实现服务发现的模块
  • nsqadmin:主要进行可视化管理的web ui工具

Nsq中实现细节

  1. 消息至少被投递一次。如果成功投递,对方会给返回FIN;否则,返回REQ。超时不响应,nsq也会将消息requeue。
  2. 重试次数,nsq通过attempts字段判断重复尝试的次数。
  3. 消息是无序的
  4. Nsq中采用push方式推送消息给消费者,保证了实时性。此外Nsq的存储的消息都是在内存中,当超过memqueue-size设置的值,Nsq会对消息进行持久化,储存到磁盘中。
  5. Nsq通过rdy_count字段进行流量控制,判断该字段是否为0是否继续推送消息给消费者。

总结

一个消息中间件必须能够集群,可扩展性要强,性能好,可靠性要高。

消息中间件以下特性考虑:

  • 消息投递策略
  • 消息时序性
  • 消息推送方式(push还是pull)
  • 消息存储到内存中还是磁盘中

参考连接

MQ(1)—— 从队列到消息中间件

MQ(2) —— 一条消息是如何从生产到被消费的

MQ(3) —— 刨根问底