2

编辑

我已将问题移至顶部。我会留下问题的描述以获取搜索帮助和某人可能想要的任何背景信息。

如果您将 memcached 库与 kestrel 一起使用,如果您在集群中使用 2 台以上的服务器并利用可靠的读取功能(或任何其他功能),那么 memcached 哈希算法是否可能总是在错误的位置查找?您是否必须更改 memcached 库中的哈希算法?我错过了什么吗?有没有人有任何见解?

背景信息

Kestrel 用户夸口说,您可以使用任何 memcached 库连接到您的 kestrel 集群,以将项目弹出和推送到队列中。想了想,好像有点不对劲。Memcached 在没有服务器间通信的集群中工作,因为客户端根据组合散列算法确定密钥的存储位置或存储位置。

kestrel 文档讨论了 kestrel 如何“大部分公平”,因为客户端连接到随机 kestrel 节点以读取或写入队列。如果您使用 memcached 客户端,您的客户端将始终在同一位置查找队列,因为 memcached 的客户端使用一致的散列算法。显然,如果您只在集群中使用单个红隼服务器,那没关系,只有一个地方可以查看。即使您使用多个节点,也可能没问题,因为您访问的是静态队列名称,因此散列算法总是在同一个地方查找。

但是,通过修改您从客户端访问的队列名称(通过添加 /open 启动可靠读取并以 /close 结束)来与 kestrel 交互的额外功能公开。从理论上讲,这应该会导致客户端始终在错误的位置查找队列,并且永远不会检索队列对象,因为它们一致地写入单个节点,并且一致地从不同的节点读取。

谢谢!

4

1 回答 1

1

免责声明:我没有使用红隼,但听起来不错,我为你的问题做了一些挖掘。引用红隼文档:

客户端拥有集群中所有服务器的列表,并为每个操作随机选择一个

看起来你是对的,你可能应该只创建自己的服务器选择算法(这可以在自定义类中轻松完成)并连接到一台服务器并使用该服务器进行一项操作(设置/获取/打开+关闭/监视器+确认),然后根据需要切换到另一个。如果 memcached 客户端会为 /open 和 /close 切换服务器,这真的会搞砸你的事务,所以它不是很安全,你必须确保在 kestrel 操作中使用相同的服务器,而不是使用 memcached 的服务器。如果您想使用监视器并确认,无论如何您都必须编写自己的客户端类,因此 memcached 客户端库的剂量并不重要。

于 2012-01-25T13:37:50.447 回答