Php 使用memcached协议和库与kestrel接口

Php 使用memcached协议和库与kestrel接口,php,memcached,queue,message-queue,kestrel,Php,Memcached,Queue,Message Queue,Kestrel,编辑 我把问题移到了最上面。我会把问题的描述留给搜索帮助和其他人可能需要的背景信息 如果您将memcached库与kestrel一起使用,那么如果您在集群中使用2台以上的服务器并利用可靠的读取功能(或任何其他功能),memcached散列算法不可能总是位于错误的位置吗?是否必须更改memcached库中的哈希算法?我错过什么了吗?有人有什么见解吗 背景信息 Kestrel用户夸口说,你可以使用任何memcached库连接到你的Kestrel集群来弹出和推送队列中的项目。考虑到这一点,它似乎有缺陷

编辑

我把问题移到了最上面。我会把问题的描述留给搜索帮助和其他人可能需要的背景信息

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

背景信息

Kestrel用户夸口说,你可以使用任何memcached库连接到你的Kestrel集群来弹出和推送队列中的项目。考虑到这一点,它似乎有缺陷。Memcached在没有服务器间通信的集群中工作,因为客户端根据散列算法确定密钥的存储位置或存储位置

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

但是,kestrel会公开额外的功能,这些功能通过修改从客户端访问的队列名称进行交互(可靠读取通过添加/打开启动,并以/关闭结束)。从理论上讲,这会导致客户机一致地查找错误的队列位置,并且永远不会检索队列对象,因为它们一致地写入到单个节点,并且从队列中读取 不同的节点,保持一致


谢谢

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

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

看起来您是对的,您可能只需要创建自己的服务器拾取算法(这可以在自定义类中轻松完成),只需连接到一个服务器并将其用于一个操作(set/get/open+close/monitor+confirm),然后根据需要切换到另一个服务器。 如果memcached客户机将服务器切换为/open和/close,这会使您的事务变得非常糟糕,因此它不是真正安全的,您必须确保在kestrel操作中使用相同的服务器,而不是memcached操作。 如果您想使用monitor和confirm,那么无论如何都必须编写自己的客户机类,因此memcached客户机库的作用并不重要