智能用户进程排队使用 Rails 4
Smart user process queuing using Rails 4
我对此有一些想法,但想在实施解决方案之前收集一些信息。
我有一个应用程序,新记录需要由客户服务代理手动评估。假设我收到 100 个新的客户查询,并且我有 10 个客户代理需要回答这些查询。实现这个排队处理器的最佳方法是什么?注意事项:
- 在任何给定时间只有一个代理可以处理请求
- 如果另一个代理已经在处理记录,则另一个代理应该无法访问它。
- 系统需要智能,因为它应该能够处理多个代理同时尝试访问同一条记录的情况(我知道用户在同一时间尝试访问同一条记录的几率同样的时间可能会很短,但我仍然需要适应这个)
我想到的一些解决方案:
- 在代理打开数据库记录时锁定它(这是否解决了上面的 #3?)
- 一次只将记录随机分配给一个代理
有人知道最好的解决方案是什么吗? (是否有 gem 可以用于此类事情?)
谢谢。
这些都很容易解决。您将有一个 Customer
模型,它引用分配给处理该客户的 CustomerAgent
,因此您的 Customer
模式中将有一个 customer_agent_id
字段,这将最初设置为 NULL
.
您将在 Customer
模型上创建一个范围,例如:
scope :available, -> { where customer_agent_id:nil }
...当您寻找下一个可用记录供客户代理处理时,您将使用该范围:
@next_customer = Customer.available.first
当您使用 CustomerAgent
关联更新记录时,您也将使用该范围,如下所示(我假设 current_user
助手指向当前登录的客户代理) :
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 语句将以如下形式结束:
UPDATE customers SET customer_agent_id = 24 WHERE id = 5 AND customer_agent_id IS NULL;
如您所见,如果刚刚为某个其他代理分配了该客户(因为 customer_agent_id
不再为 NULL)并且您'会得到 0
返回。
我对此有一些想法,但想在实施解决方案之前收集一些信息。
我有一个应用程序,新记录需要由客户服务代理手动评估。假设我收到 100 个新的客户查询,并且我有 10 个客户代理需要回答这些查询。实现这个排队处理器的最佳方法是什么?注意事项:
- 在任何给定时间只有一个代理可以处理请求
- 如果另一个代理已经在处理记录,则另一个代理应该无法访问它。
- 系统需要智能,因为它应该能够处理多个代理同时尝试访问同一条记录的情况(我知道用户在同一时间尝试访问同一条记录的几率同样的时间可能会很短,但我仍然需要适应这个)
我想到的一些解决方案:
- 在代理打开数据库记录时锁定它(这是否解决了上面的 #3?)
- 一次只将记录随机分配给一个代理
有人知道最好的解决方案是什么吗? (是否有 gem 可以用于此类事情?)
谢谢。
这些都很容易解决。您将有一个 Customer
模型,它引用分配给处理该客户的 CustomerAgent
,因此您的 Customer
模式中将有一个 customer_agent_id
字段,这将最初设置为 NULL
.
您将在 Customer
模型上创建一个范围,例如:
scope :available, -> { where customer_agent_id:nil }
...当您寻找下一个可用记录供客户代理处理时,您将使用该范围:
@next_customer = Customer.available.first
当您使用 CustomerAgent
关联更新记录时,您也将使用该范围,如下所示(我假设 current_user
助手指向当前登录的客户代理) :
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 语句将以如下形式结束:
UPDATE customers SET customer_agent_id = 24 WHERE id = 5 AND customer_agent_id IS NULL;
如您所见,如果刚刚为某个其他代理分配了该客户(因为 customer_agent_id
不再为 NULL)并且您'会得到 0
返回。