我另外用C++和C#标记了这个问题,因为项目中的两种语言都受到影响。

情况:

  • 所提到语言的模块通过memcached进行通信。他们与memcached一起运行了几个月,没有任何问题。
  • memcached在另一台服务器上运行。
  • 出于性能原因,与memcached的连接始终保持打开状态,这意味着,一旦每个模块启动,它就会连接至memcached并重用此连接,直到模块停止。

  • 现在,有一种非常罕见的情况,正在运行memcached的VM重新启动-我无法控制它。
    在这种情况下,我看到模块具有未定义的行为。

    我的问题:
    有没有一种方法可以检测到memcached实例由于重启而变得无效?
    在这种情况下,我会重新连接。

    另一点是:如果这不是一个好主意,那么此检查应与重新连接大致在同一时间进行,每次需要时我都会重新连接,然后在memcached服务器重新启动时避免出现任何问题。

    最佳答案

    我想我找到了一个可能的解决方案-似乎比我想象的要容易:

    模块启动时,将创建引用内存缓存密钥(例如HasMemcachedBeenRestarted)。该值将设置为NO

    模块作为线程运行,并由外部触发器唤醒。在这种情况下,他们会读取此memcached密钥,并且当它没有值NO时,很明显memcached已重新启动,然后重新连接。

    由于这一事实,每次唤醒线程我都必须执行一次,因此不会对性能产生任何影响。

    PS:就我而言,这并不是一件容易的事,因为有数百个线程,因此我必须向每个引用memcached键添加一个哈希,以便每个线程可以检查情况。

    否则,第一个线程将意识到memcached已重新启动,并将引用密钥再次设置为NO,这将导致以下情况:即使内部连接无效,其他线程也会认为一切正常。

    关于c# - 有没有办法检查memcached是否已重新启动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50580255/

    10-13 08:34