Zookeeper的回调函数

来源:互联网 发布:js二维数组姓名,年龄 编辑:程序博客网 时间:2024/06/16 18:13

zoo_acreate是一个异步创建结点的函数,其形参中有一个指向函数的指针(func1),和传递给该函数的data。我们可以理解为只要客户端程序已经准备好的创建该结点的所有工作,并把这条request发送出去,那么zoo_acreate就可以直接返回了,并且返回值是ZOK(但此时并不能说明结点创建成功了)。一旦服务端收到到这条request,处理后会把结果返回给客户端。我们再来看func1的形参,第一个是状态值rc,第三个是data,如果服务器创建结点成功,那么rc将会是ZOK;如果要创建的结点已经存在了,那个rc将会是ZNODEEXISTS。丰富的操作可以通过data来传递,其类型是void*。另一个需要注意的地方是在使用zoo_acreate时,传递的data尽量是一份拷贝,避免data数据被后续的操作改变了原先的值。

即使在异步的情况下,正常情况下Zookeeper客户端也能保证请求发送的顺序。但是由于网络的不稳定,有可能会其顺序造成影响。比如我们在异步调用的函数中(aset),如果其返回的状态是connect loss,那么我们通常的做法是再调用一次aset函数。可能出问题的地方就是在回调函数处理之前,程序又对相同的znode赋予了一个新值。如果网络正好在这次赋予新值前恢复,那么最后这个znode的值仍然是老值。一个解决方案就是对当前znode的值在本地进行保存,每次回调函数处理前,先去判断该值是否等于保存的值,如果不等就不再重新aset。

0 0
原创粉丝点击