多线程环境中的Redis连接(Unicorn)

时间:2012-06-07 04:53:40

标签: ruby-on-rails ruby redis unicorn

我一直在努力解决这个错误:

Redis::ProtocolError: Got 'i' as initial reply byte. 
If you're running in a multi-threaded environment, make sure you pass the :thread_safe
option when initializing the connection. If you're in a forking environment, such as 
Unicorn, you need to connect to Redis after forking.

在使用Unicorn和Redis的应用程序中间歇性地发生这种情况。从redis-rb Github issue开始,默认情况下,:thread_safe选项现已启用。我使用的是redis 2.2.2,因为redis 3.0.1与最新版本的resque不兼容。

在我的Unicorn配置中,我在fork之后使用Redis.current.quit

我还使用名为ruote-redis的gem连接到Redis,这是工作流引擎Ruote的存储实现。

如何确保我的所有Redis连接都稳定,并且我不会再出现此错误,这会破坏我们应用的正常使用?

1 个答案:

答案 0 :(得分:2)

Unicorn不是多线程的。你自己在使用线程吗?

正如文档中所述,您遇到的问题是多个Unicorn工作者共享相同的连接(即相同的底层文件描述符)。

This change,包含在版本redis-rb 3.0中,使其更加清晰。

如果您仍然遇到此错误,请发布您的Unicorn配置。