【问题标题】:Im trying to implement a dynamic multi queue system for tickets我正在尝试为票实现动态多队列系统
【发布时间】:2018-12-30 08:27:33
【问题描述】:

我正在尝试为票实施多队列系统。 我正在使用 Spring Boot 异步接收票证请求。
要求是我收到许多带有特定类型键的票。 对于我收到的每张票,我需要根据它们的类型键将它们放入队列中。 例如,我收到 A 类型的票,如果已经有 A 的队列,我应该将票放入该队列中,否则,我应该为 A 类型创建一个新队列,如果我收到另一个请求 A,我需要等待直到第一个 A 请求完成处理。 我已经上传了一张图片来准确显示我正在尝试做的事情。

我想知道解决这个问题的好方法。我知道如何为请求创建一个 FIFO 队列,但我很难创建动态多队列。

dynamic multi queue picture

【问题讨论】:

  • 你知道门票的所有可能键是什么吗?为什么没有n 队列,其中n 是可能的键数?
  • @Alexandre Dupriez 我不知道创建队列所需的键的所有可能值,以便为 n 个不同的请求键获得 n 个队列
  • 如果您事先知道n 是有界的并且该边界“足够小”,则可以将每个键映射到其自己的队列。否则,可能有一个队列,多个消费者将从该队列中轮询某个键的请求,跳过队列中与消费者键不对应的元素。请求的顺序被保留。您需要为共享队列中的每个使用者维护一个游标。此外,为了合理有效,我们可以考虑使用链表。你有多少请求/秒?
  • 问题是,我不知道有多少个键,我能知道的唯一方法是当我从请求中获取它们时,请求是异步和随机的,这意味着我可以有 50 个每秒请求或每天 1 个请求。
  • 主要目标是当我收到 3 个请求,每个请求具有不同的密钥类型时,我需要同时处理它们。如果我收到 3 个相同密钥类型的请求,那么我需要一个一个地处理它们。

标签: java multithreading spring-boot dynamic queue


【解决方案1】:

创建一个Queue<TicketType> 队列。将此称为主队列。

创建一个以工单类型为键的Map<TicketType, Queue>,其值为该类型的工单队列。

创建一个消费者池来监控主队列,并在作业进入时对其进行处理。

新票进来时

if map contains entry for that ticket type
    add new ticket to queue for that ticket type
else
    create new map entry and add queue
    add new ticket to the queue for that ticket type
    add ticket type to master queue

当消费者从主队列中获取条目时

look up ticket type in map
pull next ticket from the corresponding queue
process ticket
// After ticket is processed:
if queue for that ticket type in map is empty
    remove from map
else
    add ticket type to master queue

这里的想法是地图包含一个队列,用于每种单独的票类型。该地图中的每个队列都包含该类型的所有传入票证。

主队列包含地图中当前存在的每种工单类型的一个条目。工单类型 A 在任何时候都不能在主队列中拥有多个条目。

在使用地图队列时,您必须小心此处的同步。例如,您不想无意中删除有工单的队列。最好在添加工单时锁定地图,或者在完成工单处理后检查队列是否还有工单时锁定地图。不过,这两种操作都很快,因此您不应该遇到每秒 50 张票的突发性能问题。如果您说的是每秒持续 1,000 张票,您可能必须想出一个替代锁的方法。

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    相关资源
    最近更新 更多