博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Curator] Group Member 的使用与分析
阅读量:5740 次
发布时间:2019-06-18

本文共 3616 字,大约阅读时间需要 12 分钟。

  hot3.png

Group Member

组成员管理。

将此实例添加到一个组中,并对组内成员缓存进行维护。

1. 关键 API

org.apache.curator.framework.recipes.nodes.GroupMember

org.apache.curator.framework.recipes.nodes.PersistentNode

org.apache.curator.framework.recipes.cache.PathChildrenCache

2. 机制说明

有关PersistentNode的介绍,可以参见

有关PathChildrenCache的介绍,可以参见

GroupMember本质上就是将PersistentEphemeralNode与PathChildrenCache的组合起来使用。

3. 用法

3.1 创建

public GroupMember(CuratorFramework client,                        String membershipPath,                        String thisId,                        byte[] payload)
  • thisId
    • 组成员的ID标识符
    • 对与同一个组内的成员,其ID必须唯一
  • payload
    • 组成员的数据
    • 写入组成员节点的数据

3.2 使用

GroupMember在使用前必须调用group.start();,而在使用完成后,则需要调用group.close();close()会使得当前实例从组中移除

可以调用group.getCurrentMembers();查看成员信息。

4. 错误处理

GroupMember实例内部会处理所有的错误,并在需要时重新创建节点。

5. 源码分析

5.1 类定义

public class GroupMember implements Closeable {}
  • 实现了java.io.Closeable接口

5.2 成员变量

public class GroupMember implements Closeable{    private final PersistentEphemeralNode pen;    private final PathChildrenCache cache;    private final String thisId;}
  • pen
    • org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode
  • cache
    • org.apache.curator.framework.recipes.cache.PathChildrenCache
  • thisId

5.3 构造器

public GroupMember(CuratorFramework client, String membershipPath, String thisId){    this(client, membershipPath, thisId, CuratorFrameworkFactory.getLocalAddress());}public GroupMember(CuratorFramework client, String membershipPath, String thisId, byte[] payload){    this.thisId = Preconditions.checkNotNull(thisId, "thisId cannot be null");    cache = newPathChildrenCache(client, membershipPath);    pen = newPersistentEphemeralNode(client, membershipPath, thisId, payload);}protected PathChildrenCache newPathChildrenCache(CuratorFramework client, String membershipPath){    return new PathChildrenCache(client, membershipPath, true);}protected PersistentEphemeralNode newPersistentEphemeralNode(CuratorFramework client, String membershipPath, String thisId, byte[] payload){    return new PersistentEphemeralNode(client, PersistentEphemeralNode.Mode.EPHEMERAL, ZKPaths.makePath(membershipPath, thisId), payload);}
  • 主要是对PersistentEphemeralNodePathChildrenCache的初始化
  • 默认的成员节点数据是本机IP地址
  • 创建的节点为临时节点
    • 会创建临时节点:membershipPath/thisId
    • 所以thisId在组内必须唯一

5.4 启动

GroupMember在使用前,必须调用start()启动。

public void start(){    pen.start();    try    {        cache.start();    }    catch ( Exception e )    {        ThreadUtils.checkInterrupted(e);        Throwables.propagate(e);    }}
  1. 先通过PersistentEphemeralNode创建节点
  2. 然后调用PathChildrenCache获取节点数据并缓存

5.5 关闭

GroupMember在使用完之后,必须调用close()关闭。

public void close()    {        CloseableUtils.closeQuietly(cache);        CloseableUtils.closeQuietly(pen);    }

与启动时的顺序正相反:

  1. 先关闭节点数据缓存
  2. 再关闭节点

5.6 获取组内成员

可以调用public Map<String,byte[]> getCurrentMembers()方法获取组内成员的信息。

  • 返回Map以成员ID为key
  • 以成员的数据(payload)为value
public Map
getCurrentMembers(){ ImmutableMap.Builder
builder = ImmutableMap.builder(); boolean thisIdAdded = false; for ( ChildData data : cache.getCurrentData() ) { String id = idFromPath(data.getPath()); thisIdAdded = thisIdAdded || id.equals(thisId); builder.put(id, data.getData()); } if ( !thisIdAdded ) { builder.put(thisId, pen.getData()); // this instance is always a member } return builder.build();}
  • 如果节点中已经有thisId了,则会使用自身数据进行覆盖
  • 所以thisId不要重复

6. 小结

从某种意义上来说,GroupMember就是一个分布式的Map。

通过GroupMember可以方便的应用于分布式多个节点的简单管理。

但是其对thisId的重复性没有做什么严格的管理,所以在使用时需要注意。 thisId不论重复,实例自身都认为自己一定在组中

其使用临时节点,所以在节点意外退出时,其他组员可以通过getCurrentMembers()发现。 这样可以通过GroupMember进行,多节点的调度场景的应用。

转载于:https://my.oschina.net/roccn/blog/1019834

你可能感兴趣的文章
TFS强制撤销某个工作区的文件签出记录
查看>>
EL表达式无法显示Model中的数据
查看>>
ps6-工具的基础使用
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
es 加磁盘扩容
查看>>
linux下使用过的命令总结(未整理完)
查看>>
时间助理 时之助
查看>>
自定义转场动画
查看>>
英国征召前黑客组建“网络兵团”
查看>>
Silverlight 2.5D RPG游戏“.NET技术”技巧与特效处理:(十二)魔法系统
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
Java not support java EE1.3
查看>>
LAMP环境搭建1-mysql5.5
查看>>
第三课 Linux目录及文件管理、用户组管理及bash重定向
查看>>
shell 脚本攻略--小试牛刀
查看>>
spring boot view override
查看>>
bzoj 2282: [Sdoi2011]消防
查看>>
我的友情链接
查看>>
centos5.9使用RPM包搭建lamp平台
查看>>