免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6599 | 回复: 3

[C++] SPNetKit:http/smtp/pop3/memcached 的客户端库 [复制链接]

论坛徽章:
0
发表于 2008-01-13 17:38 |显示全部楼层
SPNetKit 主要是一个常见应用层协议的客户端库,使用 C++ 实现,目前实现了 http,smtp,pop3,memcached 。
对于每个客户端都带有一个命令行的示范例子。

http/smtp/pop3 除了 TCP 实现之外,也能支持 SSL (基于 openssl)。
memcached client 支持了最新的 memcached 1.2.4 中新增加的 'append', 'prepend', 'gets', and 'cas' 命令。

主页:http://code.google.com/p/spnetkit/
下载:http://spnetkit.googlecode.com/files/spnetkit-0.1.1.src.tar.gz

[ 本帖最后由 iunknown 于 2008-1-14 22:45 编辑 ]

论坛徽章:
0
发表于 2008-01-14 22:52 |显示全部楼层
目前好像还很少见到使用 c++ 实现的 memcached client ,c 的倒有好几个了。
不过 spnetkit 中的 memcached client 只实现了协议部分,一些高级的功能好像还没有。
比如对于多台 server 的支持方面。目前的实现如果需要支持多台 server ,调用者还需要做一些工作。
如果可以针对常见的使用场景,做一些这方面的封装,那就更方便了。

论坛徽章:
0
发表于 2008-01-16 13:56 |显示全部楼层

关于 consistent hashing

在 memcached 的官方网站上看了一下,目前关于 memcached client 的一个热点是支持 consistent hashing 这个特性。
现在对这个还不是太了解,要找个时间认真看一下。

论坛徽章:
0
发表于 2008-02-17 16:02 |显示全部楼层
原帖由 queue 于 2008-1-14 22:52 发表
目前好像还很少见到使用 c++ 实现的 memcached client ,c 的倒有好几个了。
不过 spnetkit 中的 memcached client 只实现了协议部分,一些高级的功能好像还没有。
比如对于多台 server 的支持方面。目前的实 ...


http://spnetkit.googlecode.com/files/spnetkit-0.2.0.src.tar.gz
发布了 0.2.0 版。这个版本主要是实现 memcached client 的多台服务器支持。
目前的实现采用了 consistent hashing 算法。先来看一下配置文件:

  1. [SocketPool]
  2. ConnectTimeout = 6
  3. SocketTimeout  = 6
  4. MaxIdlePerEndPoint = 10
  5. MaxIdleTime = 3600

  6. [EndPointTable]
  7. TableKeyMax = 1000
  8. Server0 = "0-199"   127.0.0.1:11211
  9. Server1 = "200-399" 127.0.0.1:11212
  10. Server2 = "400-599" 127.0.0.1:11213
  11. Server3 = "600-999" 127.0.0.1:11214
复制代码


首先是配置一个 SocketPool 。MemcachedClient 采用非阻塞 socket 方式,因此可以控制连接和数据传输时的超时时间。
MaxIdlePerEndPoint 是针对每台服务器能够保留最多的空闲连接数。
MaxIdleTime 是当从 Pool 中取出一个 Socket 的时候,如果这个 Socket 的空闲时间已经超过了 MaxIdleTime ,那么将废弃不用。

consistent hashing 算法主要体现在 EndPointTable  这个配置节中。
TableKeyMax 设定了一个集合 KeyHashSet 。
在上面的配置中,设定的 KeyHashSet 为 [0-999]
所有的 Server 从这个 KeyHashSet 中,认领一部分。
Server0 认领了 [0-199] ,Server1 认领了 [200-399] ,如此类推。
当需要对一个 key 进行操作的时候,首先对这个 key 做一次 hash 运算得到一个 HashValue 。
通过 HashValue mod TableKeyMax 得到一个在 KeyHashSet 集合内的 KeyHash 值。
然后就可以根据各台 Server 认领的情况,找到对应的 Server 。

只要保证对 key 使用的 hash 算法不变,并且 TableKeyMax 不变,那么对于同一个 Key 就总是得到同一个 KeyHash 值。
当需要对 Server 做部分调整的时候,只影响调整的那部分 Server ,其他的 Server 将不受影响。
比如上面的 Server3 认领的 KeyHash 比其他的 Server 都多,那么将来如果要对 Server3 进行拆分,可以重新做如下的配置:


  1. [EndPointTable]
  2. TableKeyMax = 1000
  3. Server0 = "0-199"   127.0.0.1:11211
  4. Server1 = "200-399" 127.0.0.1:11212
  5. Server2 = "400-599" 127.0.0.1:11213
  6. Server3 = "600-799" 127.0.0.1:11214
  7. Server4 = "800-999" 127.0.0.1:11215
复制代码


在这这样拆分之后,原来保存在 Server0/Server1/Server2 上的数据都不受影响。
受影响的只是部分原来保存在 Server3 上的数据。

[ 本帖最后由 iunknown 于 2008-2-17 16:24 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP