我们正在 Laravel 上构建一个报告应用程序,它需要从允许每秒 1 个请求的第三方服务器获取用户数据。
我们需要根据用户提取 100K 到 1000K 行,每个请求最多可以提取 250 行。
所以限制是:
1。我们可以每秒发送 1 个请求
2。每个请求 250 行
因此,它需要 400-4000 个请求/作业来获取用户数据,因此,为多个用户加载数据非常耗时并且服务器变慢。
所以,现在,我们计划使用多台服务器加载数据,例如 4-10 台服务器来获取用户数据,因此我们可以从 10 台服务器每秒发送 10 个请求。
我们如何设计系统并处理来自多个服务器的作业?
是否可以使用专用服务器来托管 Redis 并从多个服务器连接到该 Redis 服务器并执行作业?会发生任何冲突/竞争条件吗?
任何与此相关的提示或先前经验都会非常有帮助。
最佳答案
简短的回答是肯定的,这绝对是可能的,而且我之前已经在生产应用中实现过很多次了。
Redis 就像任何其他服务一样,可以在任何地方运行,客户端可以从任何地方连接到它。这完全取决于您对服务器的配置来决定具体如何发生(以及添加密码、配置 spiped、限制通过防火墙的访问等)。我建议阅读他们在管理部分的文档:https://redis.io/documentation
此外,当您确实迁移到专用的 Redis 主机时,有多个客户端访问它,您可能希望考虑让多个 Redis 服务器运行以实现可靠性、高可用性等。Redis 具有高效的并通过一些简单的配置命令轻松复制,您可以在此处阅读更多信息:https://redis.io/topics/replication
关于 Redis 的最后一件事,如果您最终实现了主从设置,您可能需要研究高可用性和自动故障转移(如果您的主实例出现故障)。 Redis 在应用程序中内置了一个非常棒的实用程序,可以监控您的主服务器和从服务器,检测主服务器何时关闭,并自动重新配置您的服务器以将其中一个从服务器提升为新的主服务器。该实用程序称为 Redis Sentinel,您可以在此处阅读相关信息:https://redis.io/topics/sentinel
对于您关于竞争条件的问题,这取决于您如何准确地编写推送到队列中的作业。不过,对于您的用例,这听起来不是什么大问题,但这实际上取决于第三方系统的限制。无论哪种方式,如果您遇到竞争条件,您仍然可以为其实现解决方案,但可能需要使用像 Redis 锁 (https://redis.io/topics/distlock) 这样的东西。 Taylor 最近为即将发布的 Laravel 5.6 版添加了一项新功能,我相信它在调度程序 (https://medium.com/@taylorotwell/laravel-5-6-preview-single-server-scheduling-54df8e0e139b) 中实现了 Redis 锁的一个版本。您可以研究它是如何实现的,并在您最终需要它时适应您的用例。
关于laravel - 从多个服务器处理 Laravel/Redis 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47440163/