【发布时间】:2013-06-10 10:02:46
【问题描述】:
POST /add-request - 添加新请求
POST /get-request - 返回第一个(最旧的)请求
我有许多被称为“奴隶”的 Java 应用程序。他们的工作是调用POST /get-request 来获取处理请求,并在处理后将其保存到数据库中。所有请求都存储在 mongoDB 中。 /add-request 只是将请求添加到数据库。 /get-request 使用 findAndModify mongo 查询从队列中获取第一个请求并将其状态设置为“处理”(需要此状态以避免从 DB 获取两次相同请求的情况)。现在奴隶只需每 2 秒调用一次 api。但我想在这里使用一些长轮询。它应该是这样的:
- 我必须在队列中保留从属请求。
- 如果没有新请求,我必须为每个从属请求设置超时以在 4 秒后发送例如 404。
- 当通过
/add-request添加新请求时,我必须从队列中获取第一个从属请求,将其从该队列中删除,从数据库获取请求并将其发送到该从属。
所以假设我必须处理程序(我正在使用 express):
function addRequest(req,res,next){
// add request to db and check if there is waiting slave request in queue
// if there is one remove it from queue, clear timeout on it, get request from db
// and send it to slave
}
function getRequest(req,res,next){
// get request from db - if there is no request add this slave request to queue
// set timeout to send 404 after 4 seconds
}
问题出在队列上 - 我尝试了许多 qpproaches,但没有任何“同步”,我无法使其工作......当两个快速处理程序对其进行操作时,是否可以确保队列中的一致性同时?问题在于超时后从队列中删除请求。我必须使用一些 uid 在队列中搜索请求,然后将其删除...
也许有一些库/工具可以实现我的目标?
当没有请求slave处理时返回404。 我希望从属设备尽快获取新请求 - 所以如果我会立即返回响应(新请求或没有请求时的 404),那么每个从属设备将不得不一直不停地调用 api 并且它会产生影响我认为关于服务器性能。所以我希望每个从服务器在返回任何数据之前在服务器上“保持”请求 4 秒。
【问题讨论】:
-
4 秒超时是为了什么?为什么不能立即返回?
-
我找不到具体的问题,但使用
findAndModify如此答案所示可以帮助多个客户:stackoverflow.com/a/16182474/95190。 404我也看不懂,是不是找不到资源?
标签: node.js mongodb long-polling