分布式环境下基于redis解决在线客服坐席动态分配的问题

摘要:
3.1尝试分配操作利用了redis的原子特性,模拟乐观锁机制。

客服分配主要考虑效率与公平

客服平常的工作状态通常在两种模式下:

1. 顾客的人数 > 客服的接待能力

2. 顾客的人数 < 客服的接待能力

第一种情况,不存在客服的公平问题,只需考虑分配效率。

第二种情况,效率不成为问题,只需分配考虑公平,让顾客尽可能的平均分配到客服,既提升客服的并行接待能力,又保证了对客服的公平性。

当然还有第三种情况,就是相等,这犹如立起来的硬币是一个瞬时的小概率事件而非常态,可以不考虑。

在分布式环境下,基于 redis 提供的共享数据结构来实现客服的动态分配,先说明下关键数据结构:

根据客服的业务分组,同一分组的在线客服存储在 redis 的 SortedSet 结构中(图1)

SortedSet 顾名思义是一种排序集,这里根据客服最近一次接待的时间戳来排序,时间戳离现时越近则排在越末尾。

客服接待了一个顾客时,更新时间戳,redis 则会对 SortedSet 中的元素重新排序,刚接待过的客服会被排到末尾。

分布式环境下基于redis解决在线客服坐席动态分配的问题第1张

图 1

每一个客服上线后在 redis 中存储一个 hash 结构来记录其动态属性,例如状态、正在接待人数、最大接待人数等(图2),同时将该客服加入其分组对应的 SortedSet 中。

重要的客服动态属性包括

SN: 正在接待人数/会话数(Session Number)

CSU_x: 客服坐席单元(Customer Service Unit),x为编号,例如客服最大接待能力为8,则其属性包括了 CSU_1 ~ CSU_8 一共 8 个 CSU 单元

MAX_CSU: 最大客服坐席单元

STATUS: 客服状态(在线/离开/挂起等)

ALLOT_FLAG: 分配标记

分布式环境下基于redis解决在线客服坐席动态分配的问题第2张

图 2

客服分配过程如下(图3):

1. 获取对应业务分组的客服列表(从 SortedSet 中获取并保持该排序)。

2. 轮询客服列表,对每个客服进行分配逻辑检查和判断(检查客服状态、正在接待人数是否达到最大人数限制等)。

3. 轮询过程中获取到一个通过各种业务规则检查的可分配客服,设置正在分配标记(阻止分布式环境下其他程序同时对其进行分配),则尝试进行分配。

3.1 尝试分配操作利用了 redis 的原子特性,模拟乐观锁机制。

3.2 对客服的正在接待人数属性进行原子 +1。

3.3 得到加1后的返回值和之前获取的正在接待人数做比较,例如检查时客服正在接待人数为 2,原子 +1 操作若没有并发冲突则会得到返回值 3,表明尝试分配成功,若返回值 > 3 说明产生了冲突,尝试分配失败。

3.3.1 若尝试分配成功,更新该客服的 CSU_x 属性对应的状态和最近接待时间,将该客服移到对应客服分组的 SortedSet 的末尾

3.3.2 若尝试分配失败,则回滚 +1 操作,进行 -1。

4. 由分配成功的程序取消该客服的正在分配标记,以确保该客服下次可以继续被分配。

5. 尝试分配失败的程序则继续尝试分配客服列表中剩下的客服

5.1 尝试分配失败意味着产生了乐观分配冲突,为避免持续的冲突,需要对剩余的客服列表进行打乱(洗牌 shuffle)处理

5.2 为了分配效率,在冲突的情况牺牲了公平性的考虑

5.3 从另一方面来说,分配产生冲突也意味着很大的几率是在前面分析的第 1 中情况下,这时牺牲公平考虑效率是合理的,因为分配过程没有考虑公平,但最终结果是公平的(所有客服都会达到接待满员)。

分布式环境下基于redis解决在线客服坐席动态分配的问题第3张

图 3


免责声明:文章转载自《分布式环境下基于redis解决在线客服坐席动态分配的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇201521123113《Java程序设计》第12周学习总结【开源】一个基于智能问答的聊天机器人实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

.NET Core项目部署时自定义端口号

我会在有时间的时候总结Linux系统的部署。NETCore项目只使用这种方法。5.IIS部署项目。指定端口号环境:Windows。NET开发人员应该熟悉IIS吗。当我们使用IIS部署Core项目时,它与之前的Framework项目的部署类似。您可以自定义端口号。...

IDEA 运行键是灰色

版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议。转载请附上原始来源链接和本声明。本文链接:https://blog.csdn.net/Butterfly_resting/article/details/89388149原因是我们的新项目没有选择源目录,如图所示:解决方案:IDEA提供了选择源目录的快速设置。右键单击src并选择MarkDire...

微信支付服务商模式支付与普通微信支付的配置区别

chapter=7_7&index=5注:与普通微信支付相比,源代码是上述7/8之间的区别,其他可以看作是服务提供商自己的微信支付配置;...

异步复位和同步释放电路的详细解释

我发现互联网上很多关于异步重置和同步释放的解释都是错误的。以下解释非常清楚。转移自:http://www.xue5.com/Developer/Software/665219.html如图所示,第一个盒子包含异步复位和同步释放电路。第一级D触发器的输入是VCC,第二级触发器的输出是可以异步复位和同步释放的复位信号。所谓异步复位和同步释放是指复位信号是异步和有...

CMD命令行正确显示中文

如果要在命令行中正确显示UTF-8字符,可以执行以下步骤:1.打开CMD exe命令行窗口2.通过chcp命令更改代码页。UTF-8的代码页为65001chcp65001。执行此操作后,代码页将变为UTF-8。但是,UTF-8字符无法在窗口中正确显示。此时,使用type命令显示UTF-8文本文件的内容:typefilename Txt4。上述操作无法完全解决...

HBuilder控制台打开方式

今天,我关闭了Hbuilder的控制台,找不到打开它的位置,!!...