我有比编程更多的逻辑问题,决定在这里问。 我应该创建一个吞吐量有限的批量短信系统。操作员只能发送2条短信/秒。我有短信网站,客户可以在其中安排批量。每个批量包含不同数量的短信(1000、2000、10 000 等(,可以随时安排。当在同一时间安排 2 个或更多散装时,例如在 15:00 点,就会出现问题。我想根据每个批量的优先级执行所有批量,这意味着它们中没有一个将首先执行,然后执行第二个、第三个等,但例如从优先级最高的批量发送 3 条短信,然后从优先级最低的 2 条短信,然后从优先级最低的一条发送 1 条短信,然后以相同的方式继续,直到发送所有短信。 我可能正在寻找某种队列,但您能提出适合我的情况的任何好解决方案和数据结构吗?
我的解决方案将是Java!
谢谢
我认为您可以在数据库中拥有 2 个表:
- 短信(ID、文本、状态bulk_id(
- 批量(id、优先级(
您可以通过获取所有批量来组织优先级,然后按要处理它们的顺序对它们进行排序。或查询它们已经排序(对于每个批量,根据需要获取任意数量的SMS(按优先级(并发送它们,然后将其标记为"已发送"。 您将知道,当此批量没有状态为"准备发送"的短信时,将处理批量。
这种方法的缺点是数据库上的负载更多,但位置非常窄(2SMS/秒(,所以这对你来说不是问题。
如果您正在获取最高优先级的消息,那么一个简单的优先级队列将在内存中或从数据库中工作。但是您打算从所有队列中获取一些消息。这是一个粗略的实现,可以给你一个想法。您可以将其推断为批量方案。
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