gpt4 book ai didi

java - 记录之间的数据交换非常慢

转载 作者:行者123 更新时间:2023-11-30 05:03:45 24 4
gpt4 key购买 nike

我们在 AIX 机器上有大量记录集,我们通过网络将其发送到 Linux 机器并进行处理。每条记录的大小约为 277 字节。

完整流程如下:

i) 程序 A 将记录发送到 java 进程 B(均在 AIX 机器上)。

ii) AIX 上的 Java 进程 B 将记录发送到 linux 上的 java 程序 C。两者都通过 java 套接字进行通信,其中 B 是客户端,C 是服务器。

iii) 程序 C 处理每条记录并将 ACK 发送回程序 B。

iv) 程序 B 将 ACK 发送回程序 A,然后程序 A 发送下一条记录。

我认为所有这些 ACK 都会耗尽网络,并且整个过程变得非常慢。例如。在最近一次运行中,它在 4 小时内处理了 330,000 条记录,然后我们遇到了套接字重置和客户端失败。

我试图找出在这种情况下更好的协议(protocol),以减少网络流量并更快地完成。 4 小时内处理 330,000 条记录确实很慢,因为程序 C 上处理每条记录的时间不到 5-10 秒,但总体流程使我们面临这个缓慢问题。

提前致谢,

-JJ

最佳答案

在发送下一条记录之前等待 ack 一直返回到 A 肯定会减慢速度,因为在发生这种情况时 C 基本上处于空闲状态。为什么不转向排队架构呢?为什么不在 C 上创建一个持久队列,它可以(通过 B)接收来自 A 的记录,然后在 C 上为该队列提供一个(或多个)处理器。

通过这种方式,您可以将 A 发送的速度与 C 处理它们的速度解耦。 A的ack就变成了消息成功投递到队列的事实。我会使用 HornetQ为此目的。

编辑

HornetQ 入门指南是 here .

如果你不能使用这个,对于最简单的非持久内存队列,只需使用Java并发库中的ThreadPoolExecutor即可。您可以像这样创建一个 ThreadPoolExecutor:

new ThreadPoolExecutor(
threadPoolSize, threadPoolSize, KEEP_ALIVE, MILLISECONDS,
new LinkedBlockingQueue<Runnable>(queueSize), ThreadPoolExecutor.DiscardOldestPolicy.discardOldest());

其中queueSize 可以是MAX_INT。您可以使用 ThreadPool 上的 Runnable 调用execute()来获取要执行的任务。因此,您在 C 中的接收代码可以简单地将这些使用 Record 创建和参数化的 Runnable 弹出到 ThreadPool 中,然后立即将 ack 返回给 A(通过 B)。

关于java - 记录之间的数据交换非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com