NSQ(8)-有赞相关改进
如何保证消息队列的高可用(HA)
NSQ 本身就是一个分布式消息队列,且支持水平扩展,无单点故障,能在无中断的情况下无缝添加集群结点。
nsq用到了集群去保证整个服务的高可用,但并不能保证单个topic的高可用,不过你可以用特定方案间接去保证。
【注】producer 指定在某台nsqd节点发送生产 topic-channel 数据, 也就只有那一台nsqd有这个数据了,其它节点是没有任何感知的,这里的重点就是,这台nsqd一旦挂了,未持久化或持久化失败的消息就可就真丢了,这跟你部署N台nsqd节点都没关系,因为并没有各节点相互备份。
有赞设计
- 增加多副本机制,每个Topic 有Leader 和 Follower, 进行相互备份。
- Leader 和 Flower 之间增加选主机制(借鉴Kafka)
- 加入 Etcd 组件
- 消息的持久化
- 客户端(Smart Client)的负载均衡
如何保证消息不被重复消费
NSQ 不能保证消息的幂等性,需要应用层进行处理,比如搞唯一约束。
如何保证消息的可靠传输
消息在生产者到NSQD 的传输过程中丢失
如果NSQD收到一条生产者消息,会返回一个
OK的标识符,应用可以根据该标识进行重发处理。NSQD丢失了数据
开启持久化数据选项,当NSQD重启之后,自动从硬盘加载数据,进行恢复,但
可能导致少量数据丢失,此处可以跟OK标识符结合起来,只有消息被持久化到磁盘之后,才会给客户端返回OK标识,所以哪怕NSQD在数据持久化之前挂了,数据丢了,由于生产者未收到OK标识符,也是可以进行重发的。消费者丢失了数据
NSQD使用了
FIN标识符,当NSQD把消息PUSH给消费者的同时,也会将消息放入inFlight队列中,当消费者成功处理了消息之后,会给NSQD返回FIN标识符,NSQD将inFlight队列中响应消息删除,否则将会重新入队,再次进行投递。
如何保证消息的顺序性
官方NSQ 不能保证消息的顺序消费,但是有赞重新设计的NSQ添加了此项特性,主要是生产者将同一类别的消息投递到同一个 partion 中,NSQD每次都只PUSH一条消息,从而保证数据的顺序性消费。
如何处理消息的过期失效问题
官方NSQ使用
defer队列来存放延迟消息,目前最大支持一天的延迟,具体采用小根堆的数据结构来存储,其优先级为剩余时间,放在堆顶的消息是最先到期,需要投递的消息,有一个goroutine 定期对inFlight队列和defer队列进行扫描,对符合要求的进行投递。
参考资料:
https://github.com/youzan/nsq/blob/master/doc/NSQ-redesigned-details.pdf
NSQ(8)-有赞相关改进的更多相关文章
- 利用redis实现分布式锁知识点总结及相关改进
利用redis实现分布式锁知识点总结及相关改进 先上原文,本文只为总结及对相关内容的质疑并提出若干意见,原文内容更详细https://www.cnblogs.com/linjiqin/p/800383 ...
- 【生成对抗网络学习 其一】经典GAN与其存在的问题和相关改进
参考资料: 1.https://github.com/dragen1860/TensorFlow-2.x-Tutorials 2.<Generative Adversarial Net> ...
- 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)
怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...
- 美团分布式ID生成框架Leaf源码分析及优化改进
本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...
- 人脸识别必读的N篇文章
一,人脸检测/跟踪 人脸检测/跟踪的目的是在图像/视频中找到各个人脸所在的位置和大小:对于跟踪而言,还需要确定帧间不同人脸间的对应关系. 1, Robust Real-time Object Dete ...
- [2017BUAA软工]结对项目:数独扩展
结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- HTML5的postMessage使用记要
HTML5提出了一个新的用来跨域传值的方法,即postMessage(这个名字太通俗了所以你最好看看是不是自己写过一个同名的把它覆盖了).幸运的是IE8就开始支持了. 我们假设有两个网站,1.com与 ...
- HTML5的postMessage使用记要////////////////////////////zzzzzzzz
2014-11-09 20:17:27http://jo2.org/html5-js-postmessage-tips/--点击数:2710 HTML5提出了一个新的用来跨域传值的方法,即po ...
- Ansible-Tower快速入门-2.准备开始【翻译】
准备开始 欢迎来到ansible tower! 首先,您可以按照下面的快速安装说明进行安装,详细的安装说明可以查看章节标题“安装和设置指南”,然后,你可以通过快速启动来快速开启和运行tower,或者设 ...
随机推荐
- 大道至简的架构设计思想之:封装(C系架构设计法,sishuok)
一起来看看大道至简的一些基本设计思想,首先我们来看一下什么是封装. 封装:也叫做信息隐藏,或者数据访问保护.放到程序上来讲,就是隐藏类的属性,还有实现细节,仅对外公开一些接口.那么外部,就只能通过这个 ...
- java数据结构与算法(day2)--简单排序
模式:设计api实现api 简单排序 举例(商品排序) 1.1Comparable接口介绍(排序算法更有通用性:对象排序) 创建对象,并且生成豆子.创建Comparable接口 1 package c ...
- Dockerfile的指令和编写
每个优秀的人,背后都有一段沉默的时光 前言 学习Docker基础知识 什么是Dockerfile? Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明 指 ...
- Matplotlib 绘图线
绘图过程如果我们自定义线的样式,包括线的类型.颜色和大小等. 线的类型 线的类型可以使用 linestyle 参数来定义,简写为 ls. 类型 简写 说明 'solid' (默认) '-' 实线 'd ...
- switch和if
#include<stdio.h> int main() { char ch1='A'; char ch2='B'; switch(ch1) { case'A': switch(ch2) ...
- Docker上安装MSSQL(SQL Server)
Mac OS X ,想安装微软的mssql-server数据库有三种方式: 第一种是在本机上安装MSSQL for Linux 版本. 第二种是安装Windows虚拟机,然后在虚拟机里面使用ISO ...
- Java Development Kit下载地址
Java Development Kit下载地址 官网下载 一般最新版本无需登录即可下载,其他历史版本需要登录Oracle账户才可以下载. 最新版下载地址: https://www.oracle.co ...
- Gitlab Ubuntu部署
一.安装存储库 sudo curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh ...
- 091_解析Callout XML 处理方式
XML: <?xml version="1.0" encoding="iso-8859-1" ?> <results> <resu ...
- android studio有关grdle配置
我们每次新建工程的时候,项目都会通过该路径下寻找适合的gradle包,如果没有则会自动下载到对应的文件夹下