首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rails 4的智能用户进程队列

使用Rails 4的智能用户进程队列
EN

Stack Overflow用户
提问于 2015-01-27 19:01:34
回答 1查看 19关注 0票数 1

关于这个问题,我有一些想法,但是在实现解决方案之前,我想收集一些信息。

我有一个应用程序,其中新的记录需要手动评估客户服务代理。假设我获得了100个新的客户查询,并且有10个客户代理需要回答这些查询。实现这个队列处理器的最佳方法是什么?值得注意的一点:

  1. 在任何给定的时间,只有一个代理可以处理请求。
  2. 如果另一个代理已经在处理记录,则另一个代理应该无法访问它。
  3. 系统需要智能,因为当多个代理试图同时访问同一记录时,它应该能够处理(我知道用户在同一时间访问同一记录的几率很小,但我仍然需要适应这种情况)。

我想过的一些解决方案:

  1. 如果代理打开数据库记录,则锁定它(这是否解决了上面的#3?)
  2. 一次只将记录随机分配给一个代理

有没有人知道最好的解决方案是什么?(我能用宝石来做这类事情吗?)

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-27 19:44:10

这些问题都很容易解决。您将有一个Customer模型,该模型引用分配给处理该客户的CustomerAgent,因此您的Customer模式中将有一个customer_agent_id字段,这将最初设置为NULL

您将在Customer模型上创建一个范围,如下所示:

代码语言:javascript
复制
scope :available, -> { where customer_agent_id:nil }

...and当您查找客户代理处理的下一个可用记录时,您将使用该范围:

代码语言:javascript
复制
@next_customer = Customer.available.first

在使用CustomerAgent关联更新记录时,您还将使用该范围,如以下所示(我假设current_user助手指向当前登录的客户代理):

代码语言:javascript
复制
rows = Customer.available.where(id:@next_customer).update_all(customer_agent_id:current_user)
if rows == 1
  # assigned correctly to this agent
else
  # agent missed out, loop back and get another customer
end

基本上,这将确保SQL语句的结果如下所示:

代码语言:javascript
复制
UPDATE customers SET customer_agent_id = 24 WHERE id = 5 AND customer_agent_id IS NULL;

如您所见,如果刚刚为该客户分配了其他代理(因为customer_agent_id不再为NULL ),则该SQL将在DB级别失败,并将返回0

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28178006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档