基于队列任务中间件重构服务熔断器
在前面的示例中,我们都是在队列任务类中编写大量的、与队列任务本身无关的代码,以及应用频率限制器和服务熔断器。
为了避免在真正的任务代码中添加无关代码,提高代码复用性,将与具体业务逻辑无关的通用代码拆分出来是个不错的选择。
任务中间件
和 HTTP 中间件一样,Laravel 支持在队列任务中使用中间件:
当队列任务运行时经过这个中间件时,会使用一个频率限制器,如果这个限制器获取到了锁,就会执行 then
第一个回调中的代码,否则执行第二个回调中的代码。
底层对应的任务中间件是 RateLimitingJobMiddleware
类,建议创建一个 App/Jobs/Middleware
目录来存放所有的队列任务中间件。
注册任务中间件
想要在队列任务中注册中间件,需要在对应的任务类中定义返回中间件数组的 middleware
方法,该数组包含了所有会使用的中间件对象实例:
还可以从当前对象中传递属性值作为任务中间件构造函数的参数:
以及注册多个中间件:
通过任务中间件实现熔断器
对于熔断器这种通用的服务代码,我们可以单独创建一个 CircuitBreakerJobMiddleware
中间件类,在其 handle
方法中编写熔断器逻辑如下:
然后,我们就可以在所有需要应用服务熔断器的队列任务中注册这个中间件了,这样一来就解耦了底层通用代码和上层队列任务的具体实现代码,提高了代码复用性和可维护性。
No Comments