我想请求一个不受并发访问保护的 Microsoft API(使用 GET 提取数据,然后使用 POST 推送)。
为了防止任何奇怪的行为,我想在访问此 Api 时使用锁。
我发现的最简单的方法(不会弄乱代码)是创建一个中间件服务(它将被定位而不是原来的服务)。 当请求时,它可以在 redis 中保存一个锁,并将请求转发给 Microsoft。 当它完成时,锁被释放。
然后,如果另一个请求到达服务器,它将被拒绝,并且我将能够执行指数退避直到锁被释放。
我的问题是:我是否必须对这个东西进行编码,或者这是一个可以在现有反向代理中找到的功能?
最佳答案
要以高可用性方式执行此操作,我相信您需要执行您编写的操作并使用某种分布式锁来确定 API 是否在使用中。
但是,如果不需要高可用性,您可以将单个 HAProxy 实例与 maxconn 结合使用为该服务器设置为 1。您还希望将 timeout queue
设置为较短的值,以便您可以处理 503 响应并执行您提到的指数退避。
backend microsoft_api_backend
timeout queue 2s
server microsoft_api 1.1.1.1:80 check maxconn 1
在 Nginx 中,你可以做一些等价的事情:
upstream microsoft_api {
server 1.1.1.1:80 max_conns=1
queue 1 timeout=2
}
server {
location / {
proxy_pass http://microsoft_api;
}
}
关于nginx - 反向代理锁定功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58650938/