Jredisfuture稳定性
-
29-09-2019 - |
题
我正在使用Jredis的同步实现,但是我计划切换到与Redis服务器通信的异步方法。
但是在此之前,我想询问社区是否实施Alphazero 杰里斯 是否足够稳定用于生产吗?
有没有人在使用它或有经验?
谢谢!
解决方案
当Jredis得到对交易语义的支持(Redis 1.3.n,Jredis Master Branch)时,当然应该足够“稳定”。
重新用于非交易命令的协议本身是原子,当发送破坏性命令时,并且在读取阶段时,连接故障允许无法恢复失败的窗口。客户无法知道Redis实际上是否处理了最后一个请求,但是由于网络故障而引起的响应被删除(例如)。甚至基本的请求/答复客户端也容易受到此影响(我认为这不仅限于Java,本身)。
由于REDIS的协议不需要任何元数据(根本不需要DML和DDL类型命令(例如没有命令序列号),因此打开了故障窗口。
使用管道,不再存在编写的命令与正在阅读的响应之间的顺序关联。 (该管道正在发送一个命令,该命令是n命令,导致Redis同时发布响应。
也就是说,管道中的每个未来对象都会被标记为错误,您将 知道 正是在哪个 回复 发生故障。
这是否有资格为“不稳定”?我认为,不。这是管道上的问题。
同样,使用交易语义的Redis 1.3.n完全解决了这个问题。
在该问题之外,有了异步(管道),您对确保您不会过分超负荷连接器承担了很大的责任。杰里斯管道在很大程度上可以保护您免受此功能(因为呼叫者的线程用于使网络写入,从而自然会抑制待处理响应队列上的输入负载)。
但是您仍然需要进行测试 - 您确实说了“生产”,对吗? ) - 并大小盒子,并在前端的加载线数量上盖上盖子。
我还可能建议不要在多核机上运行超过一台Jredis管道。在现有的实现(不块写缓冲区)中,有效率的空间(在完整的带宽利用率和最大化吞吐量的情况下)可以通过运行多个管道到同一服务器来获得。虽然一个管道忙于创建缓冲区以写作,而另一个是写作等。但是,由于它们的不可避免,这两个管道会互相干扰(不可避免 - 请记住它们是排队,必须发生某种形式的同步)并且定期缓存无效(在最坏的情况下,在每个dequeue/inqueue上 - 但是在道格·莱(Doug lea)中,我们相信。在新的系统中,宽的缓存无效周期是原始系统的一半,因此随着更多的缓存无效(平均而言)的数量两倍(平均而言)。因此,这是自我击败。但是,测试您的负载条件以及预计的生产部署平台。