我用C++和C#另外标记了这个问题,因为项目中的两种语言都受到影响。
情况:
- 上述语言的模块正在通过
memcached
进行通信。他们和memcached
一起运行了几个月,没有任何问题。 memcached
正在另一台服务器上运行。- 出于性能原因,
memcached
的连接始终保持打开状态,这意味着一旦每个模块启动,它就会连接到memcached
并重用此连接,直到模块停止。
现在,运行memcached
的 VM 重新启动的情况非常罕见 - 我无法控制它。 在这种情况下,我看到模块具有未定义的行为。
我的问题:
有没有办法检测memcached
实例因重新启动而无效?
在这种情况下,我会再次重新连接。
另一点是:如果这不是一个好主意,此检查是否应该与重新连接或多或少花费相同的时间,我每次需要时都会重新连接,然后在memcached
服务器重新启动时避免任何问题。
我想我找到了一个可能的解决方案 - 似乎比我想象的要容易:
引用memcached 密钥 - 例如HasMemcachedBeenRestarted
- 将在模块启动时创建。该值将设置为NO
。
这些模块作为线程运行,它们通过外部触发器唤醒。在这种情况下,他们读取此memcached密钥,当它没有值NO
时,很明显memcached
已重新启动,然后重新连接。
由于我必须为每个线程唤醒执行一次,因此它不会对性能产生任何影响。
PS:就我而言,这不是那么微不足道,因为有数百个线程,所以我必须向每个引用memcached键添加一个哈希值,以便每个线程可以检查情况。
否则,第一个线程会意识到memcached
已经重新启动,并将引用键再次设置为NO
这将导致其他线程认为一切正常的情况,即使内部连接变得无效。