如何保证消息队列的高可用(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)-有赞相关改进的更多相关文章

  1. 利用redis实现分布式锁知识点总结及相关改进

    利用redis实现分布式锁知识点总结及相关改进 先上原文,本文只为总结及对相关内容的质疑并提出若干意见,原文内容更详细https://www.cnblogs.com/linjiqin/p/800383 ...

  2. 【生成对抗网络学习 其一】经典GAN与其存在的问题和相关改进

    参考资料: 1.https://github.com/dragen1860/TensorFlow-2.x-Tutorials 2.<Generative Adversarial Net> ...

  3. 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)

    怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...

  4. 美团分布式ID生成框架Leaf源码分析及优化改进

    本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...

  5. 人脸识别必读的N篇文章

    一,人脸检测/跟踪 人脸检测/跟踪的目的是在图像/视频中找到各个人脸所在的位置和大小:对于跟踪而言,还需要确定帧间不同人脸间的对应关系. 1, Robust Real-time Object Dete ...

  6. [2017BUAA软工]结对项目:数独扩展

    结对项目:数独扩展 1. Github项目地址 https://github.com/Slontia/Sudoku2 2. PSP估计表格 3. 关于Information Hiding, Inter ...

  7. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  8. HTML5的postMessage使用记要

    HTML5提出了一个新的用来跨域传值的方法,即postMessage(这个名字太通俗了所以你最好看看是不是自己写过一个同名的把它覆盖了).幸运的是IE8就开始支持了. 我们假设有两个网站,1.com与 ...

  9. HTML5的postMessage使用记要////////////////////////////zzzzzzzz

    2014-11-09 20:17:27http://jo2.org/html5-js-postmessage-tips/--点击数:2710     HTML5提出了一个新的用来跨域传值的方法,即po ...

  10. Ansible-Tower快速入门-2.准备开始【翻译】

    准备开始 欢迎来到ansible tower! 首先,您可以按照下面的快速安装说明进行安装,详细的安装说明可以查看章节标题“安装和设置指南”,然后,你可以通过快速启动来快速开启和运行tower,或者设 ...

随机推荐

  1. Docker和Kubernetes网络模型

    Docker网络模型 Bridge模式(默认) Docker程序启动后会创建一个bridge0网桥,并分配一个IP,可以想象成一个虚拟的交换机,创建的容器实例都会通过虚拟网卡veth pair设备连接 ...

  2. 【FPGA学习】MATLAB与FPGA实现FIR滤波器

    本篇博客记录一下在matlab设计和在FPGA平台实现FIR滤波器的方法,平台是Xilinx的ZYNQ 参考: AMBA AXI-Stream Protocol Specification 使用mat ...

  3. conda创建和启动python虚拟环境

    conda与python虚拟环境 创建环境 conda create -n ENV_NAME python=3.9 激活环境 conda activate ENV_NAME 给虚拟环境安装包: con ...

  4. datax缺少clickhouse reader插件

    背景:想要把click house的数据源同步到clickhouse,发现Datax没有clickhousereader组件. 1.把clickhousewriter/libs下的所有jar包复制到r ...

  5. Git下载、安装与配置

    1.Git下载:   访问Git官网,下载对应操作系统的的安装包.   这里笔者是64位机器,选择如下: 2.Git安装:   打开安装包进行安装:   一路next到Finish:   在CMD中输 ...

  6. java SE02

    目录 五.面向对象 1. 封装 2. 多态 3. 继承 六.内部类 1. 局部内部类 2. 局部内部类 3. 静态内部类 4.匿名内部类 七.异常 1. 五个关键字 2. 自定义异常 五.面向对象 1 ...

  7. Visual Studio Code 使用总结

      记录一下个人在使用 VS Code 中的一些插件和设置.   该配置在编写 vue + iview 项目时使用. 文件路径 用户文件路径:%AppData%/Code/User 用户设置:sett ...

  8. BS4&xpath的使用

    0|1一 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: ''' Beautiful Soup提供一些简单的.python式的函数用来 ...

  9. 使用fopen,fscanf等函数报安全性问题的错误,unsafe...

    方法一:项目-属性-C/C++-预处理器定义,添加_CRT_SECURE_NO_WARNINGS. 方法二:使用fopen_s,fscanf_s等安全函数.

  10. C# 海康威视网络半球摄像头回调YV12取画面

    海康网络摄像头回调取画面,网口最好用千兆的网卡来做,开始用笔记本的百兆网口,不管怎么优化都是卡顿的, 后来用千兆网卡台式机的,基本就没有卡顿了,取图再加上运动检测处理,基本上十几毫秒每帧. 用回调方式 ...