NSQ 源码阅读(一) 相关概念理解

NSQ是由知名短链接服务商bitly用Go语言开发的实时消息处理系统,具有高性能、高可靠、无视单点故障等优点,是一个非常不错的新兴的消息队列解决方案。

相关概念

提到消息队列,我们先看一下消息队列的相关概念。
以下主要参考 消息队列设计精要,我提取一些我认为重要的要点

  1. 当你需要使用消息队列时,首先需要考虑它的必要性。可以使用mq的场景有很多,最常用的几种,是做业务解耦/最终一致性/广播/错峰流控等。反之,如果需要强一致性,关注业务逻辑的处理结果,则RPC显得更为合适。

  2. 解耦是消息队列要解决的最本质问题。所谓解耦,简单点讲就是一个事务,只关心核心的流程。而需要依赖其他系统但不那么重要的事情,有通知即可,无需等待结果。换句话说,基于消息的模型,关心的是“通知”,而非“处理”。

  3. 关于强一致性和最终一致性
    强一致性:系统中的某个数据被成功更新后,后续任何对该数据的读取操作都将得到更新后的值。
    最终一致性指的是两个系统的状态保持一致,要么都成功,要么都失败。当然有个时间限制,理论上越快越好,但实际上在各种异常的情况下,可能会有一定延迟达到最终一致状态,但最后两个系统的状态是一样的。

  4. 我们来看看如果需要数据落地的情况下各种存储子系统的选择。理论上,从速度来看,文件系统>分布式KV(持久化)>分布式文件系统>数据库,而可靠性却截然相反。

  5. 市面上的消息队列定义了一堆让人晕头转向的名词,如JMS 规范中的Topic/Queue,Kafka里面的Topic/Partition/ConsumerGroup,RabbitMQ里面的 Exchange等等。抛开现象看本质,无外乎是单播与广播的区别。所谓单播,就是点到点;而广播,是一点对多点。当然,对于互联网的大部分应用来说,组间广播、组内单播是最常见的情形。

nsq关注点

  1. 如何实现消息的广播,单播等

  2. 通信协议

  3. 如何保证消息不丢失?存储

  4. 如何尽可能减小消息重复,如何处理消息重复?

  5. 服务发现

  6. 如何消除单点故障?

nsq 文档

对于nsq的基本介绍这里不做搬运了,可参考官方文档,网上也有不少介绍nsq的文章

相关推荐