SMS队列优先级处理

时间:2018-06-27 07:17:53

标签: java queue

我比编程更具逻辑性,因此决定在这里提问。 我应该创建一个吞吐量有限的批量短信系统。操作员只能发送2条SMS /秒。我有SMS网站,客户可以在该网站上安排批量生产。每个批量包含不同数量的SMS(1000、2000、10000等),并且可以随时进行计划。当同时计划2个或更多批量时(例如在15:00点),就会出现问题。我想根据每个优先级执行所有批量,这意味着将不首先执行它们,然后再执行第二,第三等,但是例如从优先级最高的批量中发送3个SMS,然后发送2个SMS优先级从低到低,然后从最低优先级的1开始,然后以相同的方式继续进行,直到发送所有SMS。 我可能正在寻找某种队列,但是您能提出适合我情况的任何好的解决方案和数据结构吗?

我的解决方案将使用Java!

谢谢

2 个答案:

答案 0 :(得分:0)

我认为您可以在DB中拥有2个表:

  1. 短信(id,文本,状态,bulk_id)
  2. 批量(ID,优先级)

您可以通过获取所有批量来组织优先级,然后以要对其进行处理的顺序对其进行排序。(或查询已排序的批量)对于每个批量,您可以根据需要(优先级)获得任意数量的SMS,并发送它们,然后将其标记为“已发送”。 当该批量的SMS没有状态为“准备发送”时,您将知道批量已处理。

这种方法的缺点是您在数据库上有更多的负载,但是位置非常狭窄(2SMS /秒),所以这对您来说不是问题。

答案 1 :(得分:0)

如果您要获取最高优先级的消息,则可以在内存中或从数据库中创建一个简单的优先级队列。但是您打算从所有队列中获取一些消息。这是一个粗略的实现,可以给您一个想法。您可以将其推断为批量方案。

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

public final class NQueue
{
    private final List<Deque<String>> queues = new ArrayList<>();
    private final int[] poll;
    private int currentIndex;
    private int queueIndex;
    private final int pollWidth;

    public NQueue(int[] poll)
    {
        this.poll = new int[poll.length];
        int sum = 0;
        for (int i = 0; i < poll.length; i++)
        {
            int val = poll[i];
            sum += val;
            this.poll[i] = sum;
            queues.add(new LinkedList<>());
        }
        this.pollWidth = sum;
    }

    public synchronized void addMessage(String msg, int priority)
    {
        queues.get(priority).add(msg);
    }

    public synchronized Optional<String> removeMessage()
    {
        for (int i = 0; i < this.pollWidth; i++)
        {
            updateQueueIndex();
            String msg = queues.get(queueIndex).poll();
            currentIndex++;
            if (msg != null)
            {
                return Optional.of(msg);
            }
        }
        return Optional.empty();
    }

    private void updateQueueIndex()
    {
        if (currentIndex == pollWidth)
        {
            currentIndex = 0;
            queueIndex = 0;
        }
        else if (currentIndex == this.poll[this.queueIndex])
        {
            queueIndex++;
        }
    }
}

示例客户端。

//in every run, poll 3 from priority 0, 2 from priority 1 and 1 from priority 2
NQueue nQueue = new NQueue(new int[]{3,2,1});

nQueue.addMessage("a",0);
nQueue.addMessage("b",1);
nQueue.addMessage("c",2);
nQueue.addMessage("d",1);
nQueue.addMessage("e",0);
nQueue.addMessage("f",1);
nQueue.addMessage("g",1);

for (int i = 0; i < 10; i++)
{
    Optional<String> s = nQueue.removeMessage();
    System.out.println("s = " + s);
}

它打印

s = Optional[a]
s = Optional[e]
s = Optional[b]
s = Optional[d]
s = Optional[c]
s = Optional[f]
s = Optional[g]
s = Optional.empty
s = Optional.empty
s = Optional.empty