【问题标题】:Design : A Java Application with high throughput设计:具有高吞吐量的 Java 应用程序
【发布时间】:2014-02-27 11:00:29
【问题描述】:

我有一个场景,其中

  1. 必须读取具有特定格式、以 \n 分隔的巨大输入文件,它有近 2000 万条记录。
  2. 每条记录都必须通过以特定格式发送到服务器来读取和处理。

======================

我正在考虑如何设计它。
- 读取文件(nio)
- 读取文件的线程可以将这些块保存到 JMS 队列中。
- 创建代表 n 个服务器(数据要发送到的服务器)的 n 个线程。然后 n 个并行运行的线程可以一次获取一个块。通过向服务器发送请求来执行该块。

您能否建议上述是否可行,或者您是否发现任何缺陷:)。如果您能提出更好的方法/技术来做到这一点,那就太好了。



谢谢!

更新:我编写了一个程序来读取具有 20m 条记录的文件,使用 Apache Commons IO(文件迭代器)我以块的形式读取文件(一次 10 行)。它在 1.2 秒内读取文件。这有多好?我应该考虑去nio吗? (当我确实放了一个日志来打印这些块时,花了将近 26 秒!)

【问题讨论】:

  • 你能进一步定义 HUGE 吗?我建议从最简单的单线程实现开始。您可能会对所取得的性能感到惊讶。
  • 是的,该文件有将近 2000 万条记录,每条记录有 10 个逗号分隔的单词。
  • 块是什么意思?
  • 你应该小心并行化,因为它可能每次都会打开一个新连接,而且我猜你不想打开 100 多个与服务器的连接。
  • 使用 n 个线程的整个想法是我必须拥有 n 个服务器。最重要的是,拥有 n 个线程意味着 n 个连接到 n 个服务器。但是我仍然需要考虑如何管理网络端..使用连接工厂或那里的东西..谢谢!

标签: java multithreading nio


【解决方案1】:

2000 万条记录实际上并不多,所以首先我会尝试正常处理它,您可能会发现性能很好。

之后你需要测量东西。

您需要按顺序从磁盘读取以获得良好的速度,因此必须是单线程的。

您不希望磁盘读取等待网络或网络等待磁盘读取,因此将读取的数据放入队列是个好主意。为了获得最佳性能,您可能需要大于一行的块大小。测量不同块大小的性能以查看。

您可能会发现网络发送已经比磁盘读取快。如果是,那么你就完成了,如果不是,那么此时你可以启动更多从队列中读取的线程并用它们进行测试。

所以你的调整因素是:

  • 块大小
  • 线程数。

确保您针对各种组合的大量数据衡量性能,以找到最适合您情况的组合。

【讨论】:

  • 感谢您的详细分析。是的,我确信我必须达到 ChunkSize 和线程数的最佳值。对服务器的每次调用大约需要 200 毫秒。我仍然对使用 nio 或标准 Io 持怀疑态度。我将尝试同时读取文件并对结果进行基准测试。 (也将在这里分享)..您是否有与您的经验相关的统计数据。非常感谢!!
  • 没有统计数据,这也取决于您的协议等。这是使用块的另一个原因,就好像每个命令都是与服务器的单独连接上的单独请求一样,那么您可能会花费与实际发送数据一样多的时间来设置会话。
  • 实际上我想设置块大小以最小化与队列的交互,一个线程(将向服务器发送请求)可以在 ONCE 获取一个块,并处理该块中的所有记录通过向服务器发送请求(基于块大小)。这是个坏主意吗?
  • 服务器处理一条记录需要 200 毫秒?看起来您的瓶颈将出现在服务器端。我将有一个线程将数据从磁盘读取到缓冲区和多个从缓冲区获取数据的工作线程。所以所有处理都由工作线程完成(即将记录解析为特定格式发送到服务器)
  • 问题是我无法对服务器端做任何事情。不幸的是,这需要很长时间:(因为它有很多数据库操作等要做..:(我也想过使用执行程序并从缓冲区读取内容,但可能存在重叠。两个线程可能只读取相同的数据?[如果读取请求同时出现]我还将拥有工作线程,只是他们不读取来自缓冲区的数据,但一个 JMS 队列(速度很快)。您可以建议访问服务器的更好方法吗?使用一些框架..它是一个 SOAP 接口。
【解决方案2】:

我相信您可以批量处理记录,而不是一次发送一个。考虑到服务器需要处理的数据量,您可以避免不必要的网络跃点。

【讨论】:

  • 我同意@nithin nambiar,另一端的服务器就像一个配置系统,它一次提供一个记录..不幸的是,如果我能控制,是的,你是对的,那会保存一个很多网络延迟问题。非常感谢您的意见:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多