我们的生产系统是一个Zope工作者群集,它有一个ZEO服务器作为后端,很常见的东西。
由于我们有很多数据,我们的实例会消耗太多内存,而且我们有一个监视程序,只要超过限制就会重新启动它们。重启代码基本上是:
bin/supervisorctl reload
每当发生这种情况时,我们会收到很多来自我们的工作人员的电子邮件,其中包含堆栈跟踪(以及完整的堆栈跟踪):
Couldn't load state for 0x052aec
Traceback (most recent call last):
File "/home/service/.buildout/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 860, in setstate
self._setstate(obj)
File "/home/service/.buildout/eggs/ZODB3-3.10.5-py2.7-linux-x86_64.egg/ZODB/Connection.py", line 901, in _setstate
p, serial = self._storage.load(obj._p_oid, '')
AttributeError: 'NoneType' object has no attribute 'load'
我认为这是正常的,直到我看到this question指出这只会发生在RelStorage用户身上,而我们没有使用RelStorage ......
如果这表明某事或我们可以(我们已经做过,虽然困扰我),只是自动将我们工作人员的那些消息标记为在我们的邮件客户端上阅读?
是否有更好/更软的方式告诉Zope工作人员重启?某种"完成您正在处理的请求,然后重新启动"