Rails,RabbitMQ和Sidekiq架构[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails,RabbitMQ和Sidekiq架构[关闭]相关的知识,希望对你有一定的参考价值。
我有一个非常微不足道的 - 我猜 - 情况,以及几个实现选择。我有一个Rails应用程序(称之为Core),根据用户请求,它可以从互联网上抓取数据。爬虫没有任何业务逻辑 - 至少现在 - 但是获取和持久化数据是一项花费时间的工作,我不希望它被阻止。
我考虑过不同的架构,但是我不确定当事情扩展时哪一个会发挥最佳效果。选项:
- Sidekiq:每当用户请求抓取数据时,Sidekiq中的后台作业就会生成并抓取数据,持续存在并完成工作。这里可能的缺点是我不会支付Sidekiq Pro版本,我不确定OSS版本是否适合我的需要。
- RabbitMQ:开发一个微服务,让我们再次在Rails中称之为Fetcher,它将从RabbitMQ中获取并获取和持久化数据。我不知道在这种情况下我是否也需要后台处理,所以再次Sidekiq(或运动鞋)。如果我这样做,使用消息代理(在这种情况下)的优势是什么,而不是让Sidekiq在同一个应用程序中进行后台处理?
答案
您的建筑方案正朝着正确的方向发展。
- Sidekiq OSS:我真的相信sidekiq OSS版本将适合您的需求。它有几个功能来支持Redis支持的后台作业。我建议您阅读its documentation以了解最佳实践以及应该避免的内容。
- 微服务是一个good architectural choice to achieve scalability,因为它促进功能分解,您可以就如何单独扩展每个服务做出具体决定。但是,它会以多种方式增加系统的复杂性,要求您高度自动化基础架构。我建议你来自Martin Fowler网页的read this arcitle。他讨论了与采用微服务有关的权衡问题。
- 使用RabbitMQ的优点是在多个服务之间实现可靠的异步通信,支持可伸缩性,并提供灵活的通信方式,如pub / sub和RPC。如果你保持微服务的想法,这是正确的方法。否则,单片Rails应用程序只需要使用sidekiq。
- 如果你使用RabbitMQ,你应该使用适当的RabbitMQ client。对于ruby,在发布者和消费者服务中使用Bunny,因为它将为publish data on RabbitMQ和support background processing for receiving data提供良好的API。因此,不需要使用sidekiq来消费Fetcher服务中的数据。
- 当您要进行异步处理时,您的客户端将无法通过HTTP响应知道其请求的最终结果。因此,当您的应用程序异步处理任务(即通过用户页面上的状态更新)时,使用允许应用程序通知它们的机制会很有趣。为此目的,您可以使用Websockets,Rails已通过Action Cable支持。
我的最后一个提示是:如果您仍在为您的应用程序进行原型设计并尝试创意,我建议您遵循单一体系结构的路径,并更关注验证您的提案。但是,如果您已经有一个结构良好的提案并且知道对应用程序的预期需求,那么微服务架构可以是开发可扩展且可靠的系统的不错选择。
以上是关于Rails,RabbitMQ和Sidekiq架构[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Rails 应用程序中的默认 Sidekiq Redis 配置
部署Cloud66和DigitalOcean的Rails不会影响当前正在运行的sidekiq进程