处理来自多个服务器的 Laravel/Redis 个作业

Process Laravel/Redis job from multiple server

我们正在 Laravel 上构建一个报告应用程序,它需要从允许每秒 1 个请求的第三方服务器获取用户数据。

我们需要根据用户提取 100K1000K 行,每个请求最多可以提取 250 行。

所以限制是:

1。我们每秒可以发送 1 个请求

2。每个请求 250 行

因此,它需要 400-4000 request/jobs 来获取一个用户数据,因此,为多个用户加载数据非常耗时,而且服务器会变慢。

所以,现在,我们计划使用多台服务器加载数据,比如 4-10 台服务器来获取用户数据,因此我们可以从 10 台服务器每秒发送 10 个请求。

我们如何设计系统并处理来自多个服务器的作业?

是否可以使用专用服务器托管 Redis 并从多个服务器连接到该 Redis 服务器并执行作业? conflict/race-condition 会发生吗?

任何与此相关的提示或先前经验都会非常有帮助。

简短的回答是肯定的,这绝对有可能,而且我之前已经在生产应用程序中实施过很多次了。

Redis 就像任何其他服务一样,可以 运行 任何地方,任何地方的客户端都可以连接到它。这完全取决于您对服务器的配置来决定具体如何发生(以及添加密码、配置 spiped、限制通过防火墙的访问等)。我建议阅读他们在管理部分的文档:https://redis.io/documentation

此外,当您确实迁移到专用的 Redis 主机时,有多个客户端访问它,您可能希望考虑拥有多个 Redis 服务器 运行ning 以获得可靠性,高可用性等。Redis 通过一些简单的配置命令可以高效、轻松地进行复制,您可以在此处阅读更多信息:https://redis.io/topics/replication

关于 Redis 的最后一件事,如果您最终实施了主从设置,您可能需要研究高可用性和自动故障转移(如果您的主实例出现故障)。 Redis 在应用程序中内置了一个非常棒的实用程序,可以监控您的主服务器和从服务器,检测主服务器何时关闭,并自动重新配置您的服务器以将其中一个从服务器提升为新的主服务器。该实用程序称为 Redis Sentinel,您可以在此处阅读相关信息:https://redis.io/topics/sentinel

对于您关于竞争条件的问题,这取决于您如何准确地编写推送到队列中的作业。不过,对于您的用例,这听起来不是什么大问题,但这实际上取决于第三方系统的限制。无论哪种方式,如果您遇到竞争条件,您仍然可以为其实施解决方案,但可能需要使用诸如 Redis 锁 (https://redis.io/topics/distlock). Taylor recently added a new feature to the upcoming Laravel version 5.6 that I believe implements a version of the Redis Lock in the scheduler (https://medium.com/@taylorotwell/laravel-5-6-preview-single-server-scheduling-54df8e0e139b) 之类的东西。您可以查看它是如何实现的,并在您最终需要它时适应您的用例。