<p>据我所知,你已经排除了大部分(全部?)这类问题的常见解决方案:</p>
<ul>
<li>在字典中存储连接。。。需要N个工人,但不能保证哪个请求发送给哪个工人</li>
<li>在缓存中存储数据。。。数据太多</li>
<li>在缓存中存储连接信息。。。连接不可串行化</li>
</ul>
<p>据我所知,实际上只有1个“meta”解决方案,使用@Gahbu的字典建议,并保证对给定的<code>user</code>的请求将发送给同一个worker。一、 e.找出一种方法,每次都以同样的方式从<code>User</code>对象映射到一个给定的worker(可能按worker的数量散列它们的名称和MOD?)。在</p>
<p>如果当前活动的用户都映射到同一个worker,这个解决方案将不能充分利用N个worker,但是如果所有用户在同一时间处于活动状态的可能性相等,则工作应该均匀分布。(如果它们的可能性不尽相同,那么映射<em>可能</em>能够解释这一点)。在</p>
<p>我能想到的两种方法是:</p>
<p><strong>1。编写自定义请求分配器</strong></p>
<p>我不太熟悉apache/wsgi接口,但是。。。可以用一些自定义逻辑替换Apache服务器中将HTTP请求分派给worker的组件,这样它就可以始终向同一进程发送。在</p>
<p><strong>2。在N个单线程工作线程前面运行负载平衡器/代理</strong></p>
<p>我不确定您是否可以在这里使用现成的软件包,但概念是:</p>
<ul>
<li>运行实现此“将用户绑定到索引”逻辑的代理</li>
<li>然后让代理将请求转发到Apache/wsgiwebserver的N个副本中的一个,每个副本都有一个worker。在</li>
</ul>
<p>NB:我在这里遇到的第二个想法是:<a href="https://github.com/benoitc/gunicorn/issues/183" rel="nofollow">https://github.com/benoitc/gunicorn/issues/183</a></p>
<p><strong>摘要</strong></p>
<p>对于这两个选项,现有应用程序中的实现非常简单。您的应用程序只需更改为使用字典来存储持久连接(如果还没有,则创建一个)。在dev中测试单个实例与在生产环境中测试相同。在生产中,实例本身并不明智,因为总是询问相同的用户。在</p>
<p>我喜欢这里的选项2,原因如下:</p>
<ul>
<li>也许有一个现有的服务器包允许您定义这种代理的技巧</li>
<li>如果不是这样,创建一个自定义代理应用程序使其位于当前应用程序前面可能并不困难(特别是考虑到当请求到达<code>strangedb</code>服务时您(已经)受到的限制)</li>
</ul>