测试使用zookeeper的c客户端的情况

来源:互联网 发布:java改string编码 编辑:程序博客网 时间:2024/05/22 12:04

    zookeeper是网上java开发者谈论的比较多的分布系统框架。为了偷懒,想找一个稳定的合适的开发工具,于是就在win32平台测试了zookeeper的c客户端api。对于c语言开发者而言,zookepper的使用并是很轻松的,文档和示例显得有些简陋,。可能它的作者主要都是java的开发者,显得似乎对c不太熟系,api导出的函数总让人感觉怪怪的。

    使用c语言开发zookeeper客户端时可能有这样一些情况:

1> 无法使用调试器调试,由于调试中断程序执行时会挂起了所有的线程,包括与zk服务端通讯的IO线程。导致与服务端通讯的io线程超时,可以从其中它附带一个test文件中看到,作者其实也注意到了这个问题。

2> 因为与服务端存在超时的限制,当客户端连接超时的时候,所有API的调用都不能成功执行。zk认为超时是一种错误,官方网站的文档上甚至明确的说应该要抛一个异常给调用者,这就让使用者很难搞明白,连接明明是存在的啊?客户端相对服务端来说超时可算作错误,可客户端明明正在使用啊,为嘛告诉自己不能再使用了,除非服务端在这段时间内需要做一些处理,可能通知其他服务器,认为此时不应该响应客户端的调用(sorry没有看服务端的代码)。zk把所有的错误处理都交给了使用者,但我觉得使用者并不能处理这种错误。也许仅仅需要在c函数中的增改几行代码就可以用了。说点题外的话,很多人牛逼人士都会告诉你应该怎么把代码写好,事实上很多牛逼人士通常也并不会遵循这些准则,真是搞笑!

3>zk提供了一些原语。例如zk的文档就明确得告诉了使用者,设置观察(watcher)的回调,只会执行一次,所以api中有一些函数带了个是否设置回调的整型参数。真的要这么做,难道没有更好的办法替换这种实现吗。但大可不必些担心的说,如果我连续的调用了好几个api,后面设置的回调会不会覆盖前面的设置,zk每个都会回调但只有一次,就在调用的那个函数上设置。还有zk能保证数据一致,就好像是线程之间的同步那样,如果不是特殊的需求也不用考虑多台机器同步访问的问题,直接用api就可以了。看了下zk的示例程序queue和lock以及barrier,就是用squence类型的节点生成序号大小确定领导者(leader),好像跟c语言上的同步不是一个概念,还是简单易用的,功能却很强大。


4>测试后发现,千万注意在watcher回调函数中异常的抛出。又说点题外的话,windows上的异常的机制又像是鸡肋,不知道搞这么复杂绕那么多弯还把自己搞到了有什么用,比如就一个简单的访问异常明明可以处理的,异常一抛出展开,随随便便就把程序栈崩溃掉了,调试的时候跟踪不到。


5>zk的使用者谈得比较多的是zk应该在哪些环境下使用。个人认为zk的c客户端很可能打破现有的代码被再次重构。如果将来不会,使用者使用c客户端需要小心可能也需要自己改写库代码。



0 0