0基础web前端开发,web前端CSS全局样式

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

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

1      对前续代码的重构

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

0基础web前端开发,web前端CSS全局样式_第1张图片

以下是 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 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名最小的一个子节点,如果队列为空则等待
给零基础转行前端的人的建议:

要有专业人士的指导,尤其是学习前端找工作的,不要妄想自己一个人自学前端能找到工作,现在非常难,如果没有一个明白人帮你解决一下问题,会有非常多的弯路,中间很容易放弃,学习的不专业不说,最重要是浪费时间。

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。

最后分享一些简单的前端初阶的面试题:


问题的能力有多强。

最后分享一些简单的前端初阶的面试题:

[外链图片转存中…(img-jCLkrPxq-1626928359885)]

你可能感兴趣的:(程序员,面试,前端,大前端)