在Netflix的平台上运行着许多的业务流程,这些流程的任务是通过异步编排进行驱动,现在我们要实现一个分布式延迟队列,这个延迟队列具有如下特点:

分布式 不用外部的锁机制 高并发 至少一次语义交付 不遵循严格的FIFO 延迟队列(消息在将来某个时间之前不会从队列中取出) 优先级

一、使用Dynomite和Redis构建队列 Dynomite是一种通用的实现,可以与许多不同的key-value存储引擎一起使用。目前它提供了对Redis序列化协议(RESP)和Memcached写协议的支持。我们选择Dynomite,是因为其具有性能,多数据中心复制和高可用性的特点。此外,Dynomite提供分片和可插拔的数据存储引擎,允许我们在数据需求增加垂直和水平扩展。 1、为什么选择Redis? 我们选择Redis作为构建队列的存储引擎:

Redis架构通过提供构建队列所需的数据结构很好地支持了队列设计,同时Redis的性能也非常优秀,具备低延迟的特性 Dynomite在Redis之上提供了高可用性、对等复制以及一致性等特性,用于构建分布式集群队列。

一个队列被存储为Redis的有序集合(ZADD和ZRANGE等操作),Redis使用分数对有序集合中的成员进行排序,当往队列中存储数据时,根据优先级和超时时间计算分数。 2、使用Redis实现数据的push和pop 对于每个队列,维护三组Redis数据结构:

包含队列元素和分数的有序集合 包含消息内容的Hash集合,其中key为消息ID。 包含客户端已经消费但尚未确认的消息有序集合,Un-ack集合。

PUSH

根据消息超时(延迟队列)和优先级计算得分 添加到队列的有序集合 将Message对象到Hash集合中,key是messageId。

POP

计算当前时间为最大分数。 获取分数在0和最大分数之间的消息。 将messageID添加到unack集合中,并从队列的有序集中删除这个messageID。 如果上一步成功,则根据messageID从Redis集合中检索消息。

ACK

从unack集合中删除messageID。 从Message有效集合中删除messageID。 客户端未进行确认的消息,会被再度推回到队列中(这是一个定时任务负责检测)。

3、可用分区和机架意识 我们的队列是在Dynomite的JAVA客户端Dyno之上建立的,Dyno为持久连接提供连接池,并且可以配置为拓扑感知,此外,Dyno为应用程序提供特定的本地机架(在AWS中,机架是一个区域,例如 us-east-1a、us-east-1b等),us-east-1a的客户端将连接到相同区域的Dynomite/Redis节点,除非该节点不可用,在这种情况下该客户端将进行故障转移。这个属性被用于通过区域划分队列。 分片 队列根据可用区域进行分片,将数据推送到队列时,通过轮训机制确定分片,这种机制可以确保所有分片的数据是平衡的,每个分片都代表Redis中的有序集合,有序集中的key是queueName和AVAILABILITY _ZONE的组合。 避免全局锁

每个节点(上图中的N1...Nn)与可用性区域具有关联性,并且与该区域中的redis服务器进行通信。 Dynomite / Redis节点一次只能提供一个请求,Dynomite可以允许数千个并发连接,但是请求是由Redis中的单个线程处理,这确保了当发出两个并发调用从队列轮询元素时,是由Redis服务器顺序执行,从而避免任何本地或分布式锁。 在发生故障转移的情况下,确保没有两个客户端连接从队列中获取相同的消息。

处理Un-ACK的消息 后台进程监视UNACK集合中的消息,这些消息在给定时间内未被客户端确认(每个队列可配置)。这些消息将移回到队列中。

感兴趣可以加Java架构师群获取Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走很多的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验

注:加群要求

1、具有工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

转载于:https://juejin.im/post/5c0a2233e51d450c4571a5e6

基于Dynomite的分布式延迟队列相关推荐

  1. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列(续)

    背景 上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟J ...

  2. redis延迟队列 实现_灵感来袭,基于Redis的分布式延迟队列

    一.延迟队列 延迟队列,也就是一定时间之后将消息体放入队列,然后消费者才能正常消费.比如1分钟之后发送短信,发送邮件,检测数据状态等. 二.Redisson Delayed Queue 如果你项目中使 ...

  3. java 延时队列_Java实现简单延迟队列和分布式延迟队列

    在我们的工作中,很多地方使用延迟队列,比如订单到期没有付款取消订单,制订一个提醒的任务等都需要延迟队列,那么我们需要实现延迟队列.我们本文的梗概如下,同学们可以选择性阅读. 1. 实现一个简单的延迟队 ...

  4. 基于Docker搭建分布式消息队列Kafka

    本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示.本例搭建的 ...

  5. redisson究极爽文-手把手带你实现redisson的发布订阅,消息队列,延迟队列(死信队列),(模仿)分布式线程池

    参考资料 :分布式中间件实战:java版 (书籍), 多线程视频教程(视频)- 项目启动环境 导入依赖 <parent><groupId>org.springframework ...

  6. 基于 Kafka 和 ZooKeeper 的分布式消息队列原理

    转载:https://gitbook.cn/books/5bc446269a9adf54c7ccb8bc/index.html 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量 ...

  7. 再谈基于 Kafka 和 ZooKeeper 的分布式消息队列原理

    关于分布式消息队列,我在几个月前写过一篇文章:<深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列 >.最近,由于写作课程<分布式中间件实践之路>的契机,我 ...

  8. 深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列

    https://gitbook.cn/books/5ae1e77197c22f130e67ec4e/index.html 向作者提问 毕业于 C9 高校,硕士学历,曾在 IEEE ITS.VSD 等 ...

  9. 基于Redisson实现的延时队列RedissonDelayedQueue实现websocket服务端心跳监听

    简介 基于Redis的Redisson分布式延迟队列(Delayed Queue)结构的 RDelayedQueue. Java对象在实现了RQueue接口的基础上提供了向队列按要求延迟添加项目的功能 ...

最新文章

  1. 全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
  2. chrome 插件安装:无法添加来自此网站的应用,解决办法。安装本地crx插件方法
  3. CTFshow 命令执行 web42
  4. VB 禁止修改系统时间
  5. vue 下echarts卸载和安装指定版本
  6. 关于微信公众平台表情代码的记录
  7. Bash脚本教程之算数运算
  8. xcode7打包ipa文件
  9. 016.OpenStack及云计算(面试)常见问题
  10. Linux中移动,复制,删除,打包排除某个目录或文件
  11. 【渝粤教育】国家开放大学2018年秋季 1141t工程经济与管理 参考试题
  12. 干货来啦!!!二十种Python代码游戏源代码分享
  13. 鼎捷鼎新E10ERP软件介绍及资料
  14. Ros双线主辅同时映射一台服务器
  15. 解决保存的图片为CGI格式的问题
  16. 【剑指 Offer(专项突击版)】 043-047、049、053-054 刷题笔记【二叉树】
  17. 3.16√ 火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作
  18. QWebEngine集成Netron可视化模型
  19. 微信公众号网页授权,获取用户信息以及openid -- PHP后台
  20. 各种校验之MD5校验

热门文章

  1. Hadoop问题:启动hadoop 2.6遇到的datanode启动不了
  2. Service绑定模式
  3. Webservice常用接口大全
  4. GridView表头排序方法设置
  5. 2016年2月23日----Javascript运算符
  6. Unicode Tips
  7. 每天一个linux命令(28):diff 命令
  8. IOS9 微信支付报 prepayid 获取失败 ErrorDomainSSL, -9802
  9. Symfony2Book04:Doctrine01-介绍模型(Model)
  10. 实例解析:OperaMasks2.0中的DataGrid之一:定义DataGrid