12.1 Go nsq

Posted open-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12.1 Go nsq相关的知识,希望对你有一定的参考价值。

12.1 Go nsq

1.nsq是Go语言编写的,开源的内存分布式消息队列中间件

2.可以大规模的处理每天数以十亿级别的消息

3.分布式和去中心化拓扑结构,无单点故障

4.地址https://github.com/nsqio/nsq

1.1. nsq应用场景

1.异步处理,把非关键流程异步化,提高系统的响应时间和健壮性

技术图片

2.应用解耦,通过消息队列。

想必同学们都点过外卖,点击下单后的业务逻辑可能包括:检查库存、生成单据、发红包、短信通知等,如果这些业务同步执行,完成下单率会非常低,如发红包,短信通知等不必要的流程,异步执行即可。

此时使用MQ,可以在核心流程(扣减库存、生成订单记录)等完成后发送消息到MQ,快速结束本次流程。消费者拉取MQ消息时,发现红包、短信等消息时,再进行处理。

场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口。

技术图片

这种做法有一个缺点:

  • 当库存系统出现故障时,订单就会失败。(这样马云将少赚好多好多钱钱。。。。)
  • 订单系统和库存系统高耦合.

引入消息队列

技术图片

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
  • 库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失(马云这下高兴了,钞票快快的来呀~~)。

1.2. nsq架构原理

nsq组件

nsqd        负责接收,保存以及发送消息给消费者,的一个进程
nsqlookupd    负责维护所有nsqd的状态,提供服务发现的进程
nsqadmin    一个web管理平台,实时监控集群以及各种管理任务,(如topic,channel等任务)

架构图

技术图片

概念

topic主题概念,对应一个具体的队列,如订单数据放到order_queue这个topic
channel概念,每个消费者对应一个channel,实现消息可重复消费

nsq特性

消息默认不持久化,可配置成持久化
每条消息至少传递一次,保证消息不丢失,可能重复消费,需要业务去重
消息不保证有序

1.3. nsq使用

下载地址

https://nsq.io/deployment/installing.html

组件

nsqd 消息发送,存储,转发
nsqlookupd 服务发现
nsqadmin 管理后台

启动步骤:https://nsq.io/overview/quick_start.html

启动nsqlookupd  默认监听4160
启动nsqd --lookupd-tcp-address=127.0.0.1:4160
启动nsqadmin --lookupd-http-address=127.0.0.1:4161

可以访问http://127.0.0.1:4171/lookup看到后台,在Lookup视图创建topic

1.4. 创建topic/channel

技术图片

1.5. nsq写入消息

生产者

以上是关于12.1 Go nsq的主要内容,如果未能解决你的问题,请参考以下文章

Go语言使用NSQ消息队列

带你入门Go语言的消息队列NSQ

2022-12-29:nsq是go语言写的消息队列。请问k3s部署nsq,yaml如何写?

nsq go客户端跟不上

golang使用Nsq

nsq 启动流程讲解