当前位置: 首页 > 知识库问答 >
问题:

编年史队列意外延迟

史磊
2023-03-14
public class Client {
    public static void main(String[] args) {
    String path = "/dev/shm/queue";
    SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(path).build();
    ExcerptAppender appender = queue.acquireAppender();
    Scanner read = new Scanner(System.in);
    for (int i = 0;i<1;i++){

        for (int j=0;j<1000000;j++) {
            long time = System.nanoTime();
            appender.writeText(Long.toString(time));
        }
    }
    appender.writeText("end");
    }
}
public class Server {
    public static void main(String[] args) {
    String path = "/dev/shm/queue";
    SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(path).build();
    ExcerptTailer tailer = queue.createTailer();

    DescriptiveStatistics results = new DescriptiveStatistics();
    while (true) {
        String text = tailer.readText();
        if (text == null) {
            Jvm.pause(10);
        } else if (text.equals("end")) {
            System.out.println("Results: " + results.getMean() / 1000);
            break;
        }
        else {
            long cur = System.nanoTime();
            long recv = Long.parseLong(text);
            long diff = cur - recv;
            results.addValue(diff);
        }
    }
    }
}

共有1个答案

池阳伯
2023-03-14

延误很可能是真的。如果您尽可能快地编写,编写器可以领先于读取器,显示出运行测试的时间越长,延迟就越长。大多数消息传递系统都有流控制,这会减慢生产者的速度,但这种效果会改变测试,使其看起来更好。顺便说一句,您没有预热代码,尽管这不应该导致如此大的延迟。

我建议你试试

  • 向写入器添加忙循环,以将其限制为每微秒一条消息。例如每秒100万。
  • 忙等待阅读器或使用thread.yield()。我建议使用我们的pauser.balanced()
  • 尝试忽略预热后要查看的前20K甚至100K结果,并运行测试约10秒或更长时间。
  • 尽量不产生任何垃圾。您可以将long作为文本附加到已清除/回收的StringBuilder或字节,也可以将其写入二进制文件。
 类似资料:
  • 当我们执行一些负载测试时,我们注意到明显的性能下降,所有的调查都指出Kafka主题、生产者和消费者延迟的大幅增加。无论我们改变了多少配置或添加了更多资源,我们都无法摆脱症状。 目前,我们的需求是每秒处理10个事务(TPS),负载测试是执行20个TPS,但随着系统的发展和增加更多的功能,我们知道我们将达到500TPS的需求阶段,所以我们开始担心是否可以用Kafka实现这一点。 作为概念证明,我尝试切

  • 几天前我开始使用chronicle-queue,我正在浏览它的文档。

  • 编年史队列doco指定可以在不同的盒子上有编年史接收器,事件通过网络从单个编年史队列分发到它。(http://chronicle.software/products/chronicle-queue/)

  • 我有一个web服务器(比如tomcat),它为http请求服务 每个请求处理都可能生成一些跟踪信息。 我将把这些跟踪信息写入编年史队列(以字节[]为单位,我将自己进行编组/解编组,就像使用protobuf一样) 我将有一个专用的线程来使用裁剪器从编年史队列中读取。每个消息将只处理一次,如果失败,我将使用自己的重试策略将其放回队列以允许下次尝试。 基于以上用例,我有以下问题: > 应该使用多少追加器

  • 我在一个没有Lombok的项目中使用了Chronicle队列。一切都很好。然后我尝试在一个具有Lombok依赖项的项目中使用相同的Maven依赖项。但这次它崩溃了。我在我的AllLombokGetter和Setter注释中看到以下错误。 我可以运行这个项目。但是Eclipse在使用Lombok注释的类中显示红色警告。这是我的编年史队列依赖项。 图像在这里 有什么解决办法吗?谢谢