使用NATS替换NSQ为后台服务解耦
简介
满世界的后台都在向微服务架构发展,我对微服务的理解是将一个复杂的业务分拆为多个服务,由多个服务协作完成一个服务;在后台微服务架构时需要考虑高可用、一致性等问题,也要考虑在实现上、编码上的复杂程度,大多同行采用消息服务中间件对服务进行解耦,微服务多个服务间通过消息中间件进行通信。当然有不少做法是采用RPC方式,当服务多、出现网状RPC调用就会很复杂,管理上也不太方便。
之前我们采用NSQ进行通信(开发语言JAVA&Golang),NSQ的离线消息存储功能也蛮好用,如果程序挂了,重启后不会丢消息。
为什么用NAT替换NSQ,各有什么优缺点
特性 | NSQ | NAT |
---|---|---|
离线 | 支持 | 不支持 |
实时性 | 准实时 | 准实时 |
请求-应答 | 需自行封装 | 自带 |
NSQ的离线功能与消息顺序
- 当程序挂掉重启后可以继续接收处理消息,保证消息不丢失,这项功能对实时性要求不高的业务是非常好用的,可以异步模式,PUB端发送到NSQ就ok,无需关心SUB端处理成功与否以及处理及时性;
- 消息是可能乱序的,这种情况出现在既有离线消息又有内存实时消息的时候,NSQ是不保证绝对的消息顺序的;
NSQ的请求-应答模式
- NSQ本身只提供PUB-SUB,没有请求-应答模式,需要自己进行封装,当然也很简单;在某些业务场景使用纯异步模式不太合适,需要类似RPC的请求-应答模式;
使用NSQ消息中间件,部署应用服务(主备、双主)
以下例子以单个微服务部署两个应用为例子
- 两个应用订阅相同主题,使用相同的CHANNEL,同一条消息只有一个应用接收到,比如鉴权接口,只要一个鉴权通过即可;
- 两个应用订阅相同主题,使用不同的CHANNEL,同一条消息两个应用接收到,比如处理临时内存数据,两个应用都需要更新自身内部内存数据;
NAT的优势(什么性能之类的就不说,基本上都满足需求的)
参考 http://blog.csdn.net/chszs/article/details/50996679
- PUB/SUB模型 针对同一个主题只有订阅了都可以接收到,掉线了就接收不到(不存储离线消息)
- Request/Reply模型 当有多个订阅者收到请求后,只需要其中一个处理成功并Reply即算成功
- 队列模型 在PUB/SUB和Request/Reply上增加队列模型,同一条消息只有一个订阅者接收到
- 使用队列模型,当有多个订阅者时是随机选择订阅者发送消息,不保证负载均衡(切记)
以上,NAT支持异步调用、同步调用,双主、主备模式,假负载模式;做内部消息通信、为微服务架构解耦是非常合适的。
PS:参考
使用NATS替换NSQ为后台服务解耦的更多相关文章
- golang 后台服务设计精要
原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...
- redis在Windows下以后台服务一键搭建集群(多机器)
redis在Windows下以后台服务一键搭建集群(多机器) 一.概述 此教程介绍如何在windows系统中多台机器之间布置redis集群,同时要以后台服务的模式运行.布置以脚本的形式,一键完成.多台 ...
- redis在Windows下以后台服务一键搭建集群(单机--伪集群)
redis在Windows下以后台服务一键搭建集群(单机--伪集群) 一.概述 此教程介绍如何在windows系统中同一台机器上布置redis伪集群,同时要以后台服务的模式运行.布置以脚本的形式,一键 ...
- iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...
- 带后台服务配置的tomcat使用
tomcat服务启动,将不需要手动启动startup.bat,避免cmd窗口的出现,因为隐藏到后台服务执行: 1,下载. 官网:http://tomcat.apache.org/download-70 ...
- Android 三级联动选择城市+后台服务加载数据库
技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...
- highchart访问一次后台服务返回多张图表数据
本文承接上一篇,我们制作动态图表的时候,往往需要的不止一张图表,如果每张图表都与服务接口做一次交互的话未免太过频繁,这无论对前后还是后台都是一种压力,本文介绍一种一次访问返回多组数据的方式来减少前台与 ...
- linux/windows下启用和停止VMware后台服务的脚本
linux/windows下启用和停止VMware后台服务的脚本 linux/windows下启用和停止VMware后台服务的脚本 linux平台 windows平台 本文由乌合之众 lym瞎编,欢迎 ...
- mongodb启动后台服务
将MongoDB部署在服务器机子上时mongodb的实例应为后台服务进行的方式运行,而非前台进程,否则远程会话一关闭mongodb也跟着关闭了.本文介绍mongodb后台服务进程开启和关闭的操作. 开 ...
随机推荐
- python实现简单的聊天小程序
概要 这是一个使用python实现一个简单的聊天室的功能,里面包含群聊,私聊两种聊天方式.实现的方式是使用套接字编程的一个使用TCP协议 c/s结构的聊天室 实现思路 x01 服务端的建立 首先,在服 ...
- ElasticSearch的matchQuery与termQuery区别
matchQuery:会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到. termQuery:不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若 ...
- Sql server中如何将表A和表B的数据合并(乘积方式)
sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...
- -L、-rpath和-rpath-link的区别
链接器ld的选项有 -L,-rpath 和 -rpath-link,看了下 man ld,大致是这个意思: -L:: “链接”的时候去找的目录,也就是所有的 -lFOO 选项里的库,都会先从 -L ...
- UVa LA 3029 City Game 状态拆分,最大子矩阵O(n2) 难度:2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- HotSpot虚拟机对象探秘
参考:http://www.infoq.com/cn/articles/jvm-hotspot
- [POJ3481]Double Queue
Problem 0 结束操作 1 K P 将一个数K以优先级P加入 2 取出优先级最高的那个数 3 取出优先级最低的那个数 Solution Splay模板题 Notice 是输出数而不是输出优先级. ...
- Oracle 11gR2 Database UNDO表空间使用率居高不下处理
一.UNDO表空间监控图 Prometheus监控的到UNDO表空间使用率超过90%(90%为所有表空间告警阈值).从图中可以看到,多次增加UNDO表空间的DATAFILE,UNDO表空间达到40GB ...
- docker samba
这个就是匿名用户可以登录访问,不能写. root登录,就可以写了. #命令,是在物理机上运行的. 主要是根据dockerfile构建镜像. 启动容器 进入镜像 设置root密码. 附smb.conf ...
- python造数
做性能测试时,往往需要大量的参数化数据,比如注册. from random import Random def random_str(randomlength=8): str='' chars='01 ...