iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >基于ZooKeeper实现队列源码
  • 468
分享到

基于ZooKeeper实现队列源码

javazookeeperzookeepe 2023-05-31 03:05:38 468人浏览 独家记忆
摘要

实现原理先进先出队列是最常用的队列,使用ZooKeeper实现先进先出队列就是在特定的目录下创建PERSISTENT_EQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeepe

实现原理

先进先出队列是最常用的队列,使用ZooKeeper实现先进先出队列就是在特定的目录下创建PERSISTENT_EQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeeper的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,SEQUENTIAL序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题。

队列(Queue)

分布式队列是通用的数据结构,为了在 Zookeeper 中实现分布式队列,首先需要指定一个 Znode 节点作为队列节点(queue node), 各个分布式客户端通过调用 create() 函数向队列中放入数据,调用create()时节点路径名带"qn-"结尾,并设置顺序(sequence)节点标志。 由于设置了节点的顺序标志,新的路径名具有以下字符串模式:"_path-to-queue-node_/qn-X",X 是唯一自增号。需要从队列中获取数据/移除数据的客户端首先调用 getChildren() 函数,有数据则获取(获取数据后可以删除也可以不删),没有则在队列节点(queue node)上将 watch 设置为 true,等待触发并处理最小序号的节点(即从序号最小的节点中取数据)。

应用场景

Zookeeper队列不太适合要求高性能的场合,但可以在数据量不大的情况下考虑使用。比如已在项目中使用Zookeeper又需要小规模的队列应用,这时可以使用Zookeeper实现的队列;毕竟引进一个消息中间件会增加系统的复杂性和运维的压力。

详细代码

ZookeeperClient工具

package org.massive.common; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit;  public class ZooKeeperClient {  private static String connectionString = "localhost:2181";  private static int sessionTimeout = 10000;  public static ZooKeeper getInstance() throws IOException, InterruptedException {  //--------------------------------------------------------------  // 为避免连接还未完成就执行zookeeper的get/create/exists操作引起的(KeeperErrorCode = ConnectionLoss)  // 这里等Zookeeper的连接完成才返回实例  //--------------------------------------------------------------  final CountDownLatch connectedSignal = new CountDownLatch(1);  ZooKeeper zk = new ZooKeeper(connectionString, sessionTimeout, new Watcher() {   @Override   public void process(WatchedEvent event) {    if (event.getState() == Event.KeeperState.SyncConnected) {    connectedSignal.countDown();    } else if (event.getState() == Event.KeeperState.Expired) {    }   }   });  connectedSignal.await(sessionTimeout, TimeUnit.MILLISECONDS);  return zk;  }  public static int getSessionTimeout() {  return sessionTimeout;  }  public static void setSessionTimeout(int sessionTimeout) {  ZooKeeperClient.sessionTimeout = sessionTimeout;  } }

--结束END--

本文标题: 基于ZooKeeper实现队列源码

本文链接: https://www.lsjlt.com/news/223233.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于ZooKeeper实现队列源码
    实现原理先进先出队列是最常用的队列,使用Zookeeper实现先进先出队列就是在特定的目录下创建PERSISTENT_EQUENTIAL节点,创建成功时Watcher通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeepe...
    99+
    2023-05-31
    java zookeeper zookeepe
  • 基于Redis延迟队列的实现代码
    使用场景 工作中大家往往会遇到类似的场景: 1.对于红包场景,账户 A 对账户 B 发出红包通常在 1 天后会自动归还到原账户。 2.对于实时支付场景,如果账户 A 对商户 S 付款...
    99+
    2024-04-02
  • 基于Golang实现延迟队列(DelayQueue)
    目录背景原理堆随机删除重置元素到期时间Golang实现数据结构实现原理添加元素阻塞获取元素Channel方式阻塞读取性能测试总结背景 延迟队列是一种特殊的队列,元素入队时需要指定到期...
    99+
    2024-04-02
  • 基于Redis如何实现阻塞队列
    这篇文章主要介绍“基于Redis如何实现阻塞队列”,在日常操作中,相信很多人在基于Redis如何实现阻塞队列问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Redis如何实现阻塞队列”的疑惑有所帮助!接下来...
    99+
    2023-06-22
  • 基于Redis实现阻塞队列的方式
    日常需求开发过程中,不免会遇到需要通过代码进行异步处理的情况,比如批量发送邮件,批量发送短信,数据导入,为了减少用户的等待,不希望一直菊花转啊转,因此需要进行异步处理,做法就是讲要处...
    99+
    2024-04-02
  • .NETCore基于RabbitMQ实现延时队列的两方法
    目录前言实现延时队列的两种方式利用rabbitmq死信队列x-dead-letter-exchange和x-dead-letter-routing-key.NETCore实现方式ra...
    99+
    2024-04-02
  • 基于Zookeeper实现分布式锁详解
    目录1、什么是Zookeeper?2、Zookeeper节点类型3、Zookeeper环境搭建4、Zookeeper基本使用5、Zookeeper应用场景6、Zookeeper分布式...
    99+
    2024-04-02
  • 基于Zookeeper怎么实现分布式锁
    这篇文章主要介绍“基于Zookeeper怎么实现分布式锁”,在日常操作中,相信很多人在基于Zookeeper怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Zookeeper怎么实现分布式锁...
    99+
    2023-06-22
  • ThinkPHP基于think-queue的队列插件实现消息推送
    目录前言安装搭建消息队列的存储环境消息的创建与推送消息的消费与删除发布任务处理任务think-queue是ThinkPHP官方提供的一个消息队列服务,是专门支持队列服务的扩展包。th...
    99+
    2022-12-14
    thinkphp think-queue 消息推送
  • Java基于堆结构实现优先队列功能示例
    本文实例讲述了Java基于堆结构实现优先队列功能。分享给大家供大家参考,具体如下:package Demo;import java.util.NoSuchElementException;public class JPriorityQueu...
    99+
    2023-05-30
    java 优先队列 ava
  • 基于ArrayList源码解析(基于JDK1.8)
    目录下图是ArrayList的UML图从图中我们可以看出下面是源码解析的部分总结ArrrayList是Java中经常被用到的集合,弄清楚它的底层实现,有利于我们更好地使用它。 下图是...
    99+
    2023-03-13
    ArrayList源码解析 ArrayList JDK1.8 ArrayList源码
  • C++基于OpenCV实现手势识别的源码
    先给大家上效果图: 源码在下面 使用 RGB 值分割手部区域,即手部的 GB 值将与背景不同 或者使用边缘检测 或者 背景减法。  我这里使用了背景减法模型。OpenC...
    99+
    2024-04-02
  • 基于Canal以及消息队列实现MySQL的Binlog近实时同步
    基于Canal以及消息队列实现MySQL的Binlog近实时同步 1.canal的应用场景 目前普遍基于日志增量订阅和消费的业务,主要包括 基于数据库增量日志解析,提供增量数据订阅和消费数据库镜像数据库实时备份索引构建和实时维护(拆分异构索...
    99+
    2023-08-21
    mysql 数据库 java
  • java队列实现方法(顺序队列,链式队列,循环队列)
    双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略。ArrayDeque包括顺序栈和顺序队列,LinkedList包含链式栈和链式队列。ArrayDeque和LinkedList都是线程不安全的。Pr...
    99+
    2023-05-30
    java 队列 顺序
  • 基于Java数组实现循环队列的两种方法小结
    用java实现循环队列的方法:1、添加一个属性size用来记录眼下的元素个数。目的是当head=rear的时候。通过size=0还是size=数组长度。来区分队列为空,或者队列已满。2、数组中仅仅存储数组大小-1个元素,保证rear转一圈之...
    99+
    2023-05-30
    java 数组 循环队列
  • Laravel实现队列的示例代码
    目录一:队列配置1:队列相关配置2:不同队列依赖二:创建队列任务三:任务分发1:默认分发2:延时分发3:指定队列分发4:指定驱动分发5:指定驱动和队列分发四:任务处理五:失败任务处理...
    99+
    2023-02-10
    Laravel实现队列 Laravel 队列
  • C++代码实现链队列详解
    目录主要功能:完整代码展示:总结主要功能: 初始化、入队、出队、取队头元素、销毁队列、输出队列 完整代码展示: #include <iostream> using n...
    99+
    2024-04-02
  • golang 实现队列
    队列是一种先进先出(FIFO)的数据结构,常用于解决计算机程序中的各种问题。在 Go 语言中,可以使用标准库中的 container 包来实现队列数据结构。创建队列要创建一个队列,我们需要使用 container 包中的 list 库来创建...
    99+
    2023-05-16
  • Java栈和基础队列的实现详解
    目录栈(stack)栈支持的三个核心操作:栈的常见实际应用:栈的实现队列无论是哪种队列,都必须支持三个核心操作:基础队列的实现 栈和队列:都是线性表,都是基于List基础上...
    99+
    2024-04-02
  • 基于ArrayList源码分析
    本篇内容主要讲解“基于ArrayList源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于ArrayList源码分析”吧!ArrrayList是Java中经常被用到的集合,弄清楚它的底层...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作