客服分配并发场景,怎么设计比较好?

发布于 2022-09-01 07:40:06 字数 246 浏览 14 评论 0

请教一个客服场景下的并发解决方案。
假设1个客服可以服务10个用户,然后有10个客服。

1.客服登录,用户请求分配客服,如果客服都在忙,则返回排队号,等有客服空闲时,则分配给排队队列队首的用户。
2.客服随时会登录,退出。用户随时会加入,放弃排队。
3. 客服服应该平均分配,比如10个用户进来,应该是每个客服服务一个。

Q:
1.请问下这个队列怎么设计比较好?
2.java中用什么并发集合比较合适?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放我走吧 2022-09-08 07:40:06

1.用户存在一个队列里就好
2.用户放弃不用特殊处理,排到的时候叫号不答应扔掉找下一个
3.客服可以这样做:开一个线性表 n[11],它的每一个元素是一个链表,存着一些客服,其中 n[i] 存着正在服务 i 个用户的客服。每次一个客服新接到或服务完用户后,把它从 n[i] 中取出,放进 n[i - 1] 或 n[i + 1]。维护一个变量 s,表示当前服务用户最少的客服。每次 n[s] 有一个客服搬进 n[s - 1] 时令 s -= 1,n[s] 最后一个客服搬进 n[s + 1] 时令 s += 1。

栗子:
假设有三个客服a,b,c,每个客服最多服务三个用户:

一开始,

s = 0
i | 0 | 1 | 2 | 3 | 4 
n |abc|   |   |   |

来了一个用户,分配给客服a

s = 0
i | 0 | 1 | 2 | 3 | 4 
n | bc|a  |   |   |

又来了一个用户,分配给客服b

s = 0
i | 0 | 1 | 2 | 3 | 4 
n |  c|ab |   |   |

又来了一个用户,分配给客服c
注意到这个时候 n[s] 里只有一个客服了,然后这个客服被挪到 n[s + 1],所以令 s += 1

s = 1
i | 0 | 1 | 2 | 3 | 4 
n |   |abc|   |   |

然后客服a服务的客户走了,注意到a就在n[s]里,所以令s -= 1

s = 0
i | 0 | 1 | 2 | 3 | 4 
n |a  | bc|   |   |

然后比如说又来了 6 个客户,分配完以后是这种情况:

s = 2
i | 0 | 1 | 2 | 3 | 4 
n |   |   | b |a c|
悸初 2022-09-08 07:40:06

我写一下大概的想法吧...
每个客服都是一个单独的对象, 这个对象上面存客服数据(工号,窗口号 等等), 还存一个正在处理的用户对象(暂时存着, 目前还想不到是否有必要..)
所有等待的用户存在一个有序列表里(比如 linkedList).

写一个管理器. 管理所有客服对象和用户列表.
这个管理器里加一个定时器. 每隔几秒就调用一下 用户分配 的方法.
这个方法里 遍历所有客服对象. 检查当前客服服务的用户数量, 如果不满 10个 就从用户列表里取出一个加上.(这里可以增加一些判断, 比如, 记录一下最少的客服服务用户的数量, 如果后面的客服有超过这个数量, 就不分配给他新用户, 而是等到下次调用这个方法的时候分配给服务用户少的客服.. 大概是这个意思, 这样实现你的平均分配. ps: 你也可以每次调用这个方法完最后给客服按照服务数量排序. 这个方法是分配的核心代码.)

集合的选用, 选择有序的就行, 不管是否同步, 不同步的话,自己在外部加锁就可以了, 并没有什么大的消耗.

另一种方案是.. 每个客服处理完之后自己去队列里要用户, 但是那个方案不太好控制平均分配,写出来的代码会比较怪, 客服不仅要去要用户, 还要去看别的客服处理的用户数量来判断自己要多少用户... 很怪异.. 所以这个方案我倒是还没想到怎么弄...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文