首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用单线程读取两个编年史队列

使用单线程读取两个编年史队列
EN

Stack Overflow用户
提问于 2020-02-04 06:14:05
回答 1查看 222关注 0票数 0

我正在尝试构建一个服务,在这个服务中,我将在一个历史记录队列中获得一种类型的消息,在同一进程中在另一个历史记录队列中获得另一种类型的消息。我不想给每个队列提供2个专用线程,因为这些消息的频率不会很高,尽管它们需要以最小的延迟来响应。我仍然可以为这两个队列提供一个线程。您在设计这方面的建议是什么,以便我可以使用一个线程读取2个或多个队列?

EN

回答 1

Stack Overflow用户

发布于 2020-03-13 10:51:00

首先,如果可能的话,我建议您对两种类型的消息使用相同的队列--这将是最快的选择,原因有几个,主要原因是内存局部性。

但是,您也可以在多个队列中执行循环样式阅读,例如:

代码语言:javascript
运行
复制
ChronicleQueue q1 = ...;
ChronicleQueue q2 = ...;
ExcerptTailer tailer1 = q1.createTailer();
ExcerptTailer tailer2 = q2.createTailer();
while (true) {
    try (DocumentContext dc = tailer1.readingDocument()) {
        if (dc.isPresent()) {
            // do something with message type 1
        }
    }
    try (DocumentContext dc = tailer2.readingDocument()) {
        if (dc.isPresent()) {
            // do something with message type 2
        }
    }
}

或采用methodReader风格:

代码语言:javascript
运行
复制
ChronicleQueue q1 = ...;
ChronicleQueue q2 = ...;
ExcerptTailer tailer1 = q1.createTailer();
ExcerptTailer tailer2 = q2.createTailer();
MethodReader reader1 = tailer1.methodReader(MessageTypeOneInterface.class);
MethodReader reader2 = tailer2.methodReader(MessageTypeTwoInterface.class);
while (true) {
    reader1.readOne();
    reader2.readOne();
}

如果队列中没有新消息,那么调用tailer.readingDocument() (或等效的reader.readOne())是非常便宜的(实际上,它只是几次易失性读取)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60051583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档