web前端开发入门学习,前端自学难吗

生产-消费者队列,用于多节点的分布式数据结构,生产和消费数据。生产者创建一个数据对象,并放到队列中;消费者从队列中取出一个数据对象并进行处理。在ZooKeeper中,队列可以使用一个容器节点下创建多个子节点来实现;创建子节点时,CreateMode使用 PERSISTENT_SEQUENTIAL,ZooKeeper会自动在节点名称后面添加唯一序列号。EPHEMERAL_SEQUENTIAL也有同样的特点,区别在于会话结束后是否会自动删除。

敲小黑板:*_SEQUENTIAL是ZooKeeper的一个很重要的特性,分布式锁、选举制度都依靠这个特性实现的。

1      对前续代码的重构

之前的文章,我们已经用实现了Watcher和Barrier,创建ZooKeeper连接的代码已经复制了一遍。后续还需要类似的工作,因此先对原有代码做一下重构,让代码味道干净一点。

以下是 process(WatchedEvent)的代码

final public void process(WatchedEvent event) {
  if (Event.EventType.None.equals(event.getType())) {
    // 连接状态发生变化
    if (Event.KeeperState.SyncConnected.equals(event.getState())) {
      // 连接建立成功
      connectedSemaphore.countDown();
    }
  } else if (Event.EventType.NodeCreated.equals(event.getType())) {
    processNodeCreated(event);
  } else if (Event.EventType.NodeDeleted.equals(event.getType())) {
    processNodeDeleted(event);
  } else if (Event.EventType.NodeDataChanged.equals(event.getType())) {
    processNodeDataChanged(event);
  } else if (Event.EventType.NodeChildrenChanged.equals(event.getType())) {
    processNodeChildrenChanged(event);
  }
}

以ZooKeeperBarrier为例,看看重构之后的构造函数和监听Event的代码

ZooKeeperBarrier(String address, String tableSerial, int tableCapacity, String customerName)
    throws IOException {
  super(address);
  this.tableSerial = createRootNode(tableSerial);
  this.tableCapacity = tableCapacity;
  this.customerName = customerName;
}
protected void processNodeChildrenChanged(WatchedEvent event) {
  log.info("{} 接收到了通知 : {}", customerName, event.getType());
  // 子节点有变化
  synchronized (mutex) {
    mutex.notify();
  }
}

2 队列的生产者

生产者的关键代码

String elementName = queueName + "/element";
ArrayList<ACL> ids = ZooDefs.Ids.OPEN_ACL_UNSAFE;
CreateMode createMode = CreateMode.PERSISTENT_SEQUENTIAL;
getZooKeeper().create(elementName, value, ids, createMode);

注意,重点是PERSISTENT_SEQUENTIAL,PERSISTENT是表示永久存储直到有命令删除,SEQUENTIAL表示自动在后面添加自增的唯一序列号。这样,尽管elementName都一样,但实际生成的zNode名字在 “element”后面会添加格式为%010d的10个数字,如0000000001。如一个完整的zNode名可能为/queue/element0000000021。

3 队列的消费者

消费者尝试从子节点列表获取zNode名最小的一个子节点,如果队列为空则等待

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦,如果有需要前端校招面试题PDF完整版的朋友可以点击这里即可免费获取,包括答案解析。

ip204888/web-p7),包括答案解析。**

[外链图片转存中…(img-MuFUCPzP-1627096545662)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值