【问题标题】:Using the memcached protocol and library to interface with kestrel使用 memcached 协议和库与 kestrel 交互
【发布时间】:2012-02-15 18:18:40
【问题描述】:

编辑

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

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

背景信息

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

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

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

谢谢!

【问题讨论】:

    标签: php memcached queue message-queue kestrel


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多