[译]ZOOKEEPER RECIPES-Queues
队列
分布式队列是一种常见的数据结构。为了在ZooKepeer中实现分布式队列,第一步是要使用一个znode代表队列本身。分布式客户端通过create()方法将内容放入一个名叫"queue-"的sequence ephemeral节点。由于是使用sequence节点,创建的路径将是_path-to-queue_/queue-X,其中X是一个递增的数字。当一个客户端希望移除一个内容,它可以调用getChildren方法,并设置watch为true,并从最小的子节点开始处理。不到整个子节点处理完成,客户端不需要再次调用getChildren方法。如果没有子节点,消费者可以等待watch触发再次查询队列。
在ZooKepeer的发布中src/recipes/queue(https://github.com/apache/zookeeper/tree/master/src/recipes/queue)的目录有ZooKeeper的Queue实现
优先级队列
如果需要实现一个优先级队列,你只要在以上队列中进行两处简单改动。第一在增加到队列中时,路径名称使用"queue-YY",其中YY表示优先级,越小优先级越高。第二,在移除节点时,客户端使用实时的子节点列表。也就是当watch事件触发会使用新的子元素列表来取代原有的列表
Curator实现
public static <T> QueueBuilder<T> builder(CuratorFramework client, QueueConsumer<T> consumer, QueueSerializer<T> serializer, java.lang.String queuePath)
/**
创建queue的Builder方法
client 客户端实例
consumer 消息消费者-如果是生产者可以设为null
serializer 序列化用
queuePath 队列的地址
**/
QueueBuilder<MessageType> builder = QueueBuilder.builder(client, consumer, serializer, path);
DistributedQueue<MessageType queue = builder.build();
queue.put(aMessage); //将消息放入队列
其中QueueBuilder可以使用函数式的方法调用更多配置的方法,如lockPath可以确保消息在成功处理之后才会被从queue中删除,达到类似事务的功能。
问题
Curator不建议使用ZooKeeper来实现Queue。原因如下
- ZooKeeper有1MB的传输限制。所以ZNode需要较小。较难处理大数据量的队列
- ZooKeeper在拥有大ZNode时启动时会相对较慢,会显著拖慢queue初始化和同步过程
- ZNode过大时会较难清理。getChildren会调用失败。Netflix自己创建了特定的处理过程,增大jute.maxbuffer来处理并删除大节点
- ZooKeeper性能在有很多节点且拥有大量子节点的情况下表现不佳
- ZooKeeper数据时存在内存中的。所以内存大小会是一个瓶颈
[译]ZOOKEEPER RECIPES-Queues的更多相关文章
- ZooKeeper Recipes and Solutions 翻译
ZooKeeper 秘诀 与解决方案 A Guide to Creating Higher-level Constructs with ZooKeeper Out of the Box Applica ...
- ZooKeeper Recipes and Solutions
原文地址:http://zookeeper.apache.org/doc/current/recipes.html 参考:https://zookeeper.apache.org/doc/trunk/ ...
- [译]ZooKeeper recipes-引言
ZooKeeper高级应用 本系列将指导使用ZooKeeper来实现高级功能,所有功能都在客户端完成,不需要ZooKeeper的特殊支持.希望可以得到社区的支持将这些加入到一个标准的客户端类库中(Cu ...
- [译]ZOOKEEPER RECIPES-Locks
锁 全局式分布式锁要求任何时刻没有两个客户端会获得同一个锁对象,这可以通过使用ZooKeeper实现.像优先级队列一样,首先需要定义一个锁节点. 在ZooKepeer的发布中src/recipes/l ...
- [译]ZOOKEEPER RECIPES-Leader Election
选主 使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志.主要思想是,使用一个znode,比如"/election",每个客 ...
- [译]ZOOKEEPER RECIPES-TWO PHASED COMMIT
两段式提交 两段式提交协议可以让所有分布式系统中的客户端达成协议同时提交或回滚事务. 在ZooKeeper中你可以通过协调者(coordinator)创建一个事务节点来实现两段式提交.例如" ...
- [译]ZOOKEEPER RECIPES-Barriers
Barrier 在分布式系统中常使用Barrier来阻塞进程,当满足一定条件后再恢复进行后续操作.Barrier在Zookeeper中可以通过设计一个Barrier节点来实现.Barrier 节点存在 ...
- <译>Zookeeper官方文档
apache原文地址:http://zookeeper.apache.org/doc/trunk/zookeeperOver.html ZooKeeper ZooKeeper: A Distribut ...
- [译]Zookeeper的优点与局限性
1.Zookeeper的优点与局限性 在学习了Zookeeper(后文都简称zk)的介绍和功能后,您已经很好地理解了zk. 现在,在这个zk教程中,我们将讨论zk的优点和局限性. zk有几个功能对用户 ...
随机推荐
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- CLR 这些年有啥变化吗?
引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.为避免广告之嫌,所以这里只提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体, ...
- 传播正能量——做一个快乐的程序员
引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...
- LeetCode-4MedianofTwoSortedArrays(C#)
# 题目 4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n resp ...
- HTML kbd键盘元素
1. 说明 kbd :即Keyboard Input Element(键盘输入元素).表示键盘按键的语义元素,常用于网页上对快捷键.按键说明的场景. 样式规格:内联样式. 为了在页面上突出显示,可以给 ...
- Zabbix基本配置及监控主机
监控主机一版需要在被监控的主机上安装Zabbix Agent 监控主机 安装zabbix-agent 首先需要在被监控的主机上安装agent,可以下载预编译好的RPM进行安装,下载地址:http:// ...
- Web安全相关(三):开放重定向(Open Redirection)
简介 那些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击. 场景分析 假设有一个正规网站http:// ...
- C# await和async
基础阅读:http://www.cnblogs.com/jesse2013/p/async-and-await.html 答疑阅读:http://www.cnblogs.com/heyuquan/ar ...
- 基于window7+caffe实现图像艺术风格转换style-transfer
这个是在去年微博里面非常流行的,在git_hub上的代码是https://github.com/fzliu/style-transfer 比如这是梵高的画 这是你自己的照片 然后你想生成这样 怎么实现 ...
- ABP领域层
1.实体Entites 1.1 概念 实体是DDD(领域驱动设计)的核心概念之一. 实体是具有唯一标识的ID且存储在数据库总.实体通常被映射成数据库中的一个表. 在ABP中,实体继承自Entity类. ...