2

我正在考虑解决一个编程问题,我想我需要了解很多高级编程概念。由于某些原因,我决定用 Java 编写代码——即使我并不精通它。因此,我希望您在建议、指导、资源指针、书籍、教程或任何您认为相关的通用建议方面为我提供帮助。

这是我的问题的基本性质:

  1. 我需要创建一个客户端-服务器架构。服务器支持多个并发客户端。客户端向它发送简单的指令(可能是服务器公开某种 API/在特定端口上运行侦听器),服务器执行指令并将结果发送回客户端。

  2. 服务器的主要工作是根据给它的指令进行大量的数据处理。它从后端数据库/文件系统获取数据。数据量可轻松飙升至~ 200GB-700GB。数据通常会流式传输到它,但在处理过程中可能需要在内存缓存中保存大量数据(如果 RAM 不够,则将其分页到磁盘)。计算本质上通常是数值密集型的(假设取矩阵的逆)

  3. 服务器应该能够进行多线程处理(我不知道这个术语在 Java 中是什么意思,我希望服务器应该能够在多个并行子进程中分发作业。)

  4. 服务器本身应该非常轻量级。我不需要任何 GUI界面。

  5. 如果我以某种方式设计它,这样我以后可以将它与Hadoop等 HPC 框架集成,那就太好了。

现在如果我必须这样做,我需要学习什么样的编程?顺便说一句,我对 OOP 有很好的理解,我对数据结构和算法有点熟悉,我知道基本的 Java(以前从未在 Java 中做过任何网络或多线程编程,但使用过典型的 oop 概念、泛型、可比较的接口等。)。我主要从事数据库编程工作,但过去也做过很多 C、C++、C#、Python。

鉴于要求和我的背景,请提出建议,

  1. 我应该如何开始这个项目?构建项目的方法是什么?
  2. 我应该先创建一些基本的 API 定义,然后再开始处理细节吗?
  3. 我应该遵循任何特定的设计模式吗?从哪里学习它们?
  4. 我需要在 Java 中学习什么以及从哪里学习它们?
  5. 在内存中读取大量数据的最佳方法是什么?Java nio 是好的解决方案吗?
  6. 如果我用大量数据实例化一个类,它会工作吗?(例如,假设我有一个 Vector 类来表示具有数百万个元素的矩阵,并且该类的构造函数读取内存中的大量数据集)。处理它的最佳方法是什么?
4

2 回答 2

1

首先,我想说的是,根据您对事物的解释,您似乎可以很好地使用 java 作为服务器端语言。

您选择的客户端服务器架构类型可能取决于您实际服务的客户端类型。它们是典型的基于 GUI 或 CUI 的桌面客户端还是 Web 客户端。

在后一种情况下,您可以以正常方式使用 Spring Framework,而对于前一种情况,您可以进一步探索 Spring 对 Restful Web 服务的支持。我建议不要使用基于套接字或 TCP 的网络解决方案或使用 java 网络。

SpringRESTful API为您提供了对网络和多线程等事物的非常酷的抽象,即使对于基于桌面的客户端也是如此。在桌面客户端的情况下,您可以使用 JSON/XML 作为响应,并且可以使用HttpClient库来调用服务器,这是对底层网络内容的非常酷的抽象。

进一步,Spring 的设计模式遵循linear数据流。您的许多基本设计考虑因素都由 Spring 本身使用Dependency InjectionInversion of Control并且非常易于合并。

对于与特定需求相关的设计模式的详细分析,我建议您阅读名为Publications 的书,作者Java Design Patterns: A Tutorial是.Addison WesleyJames W. Cooper

关于 API 设计的另一件事。您最好先创建一个 API 规范,然后再进一步实施它们。

于 2012-10-10T09:56:43.190 回答
1

您需要定义客户端和服务器如何相互通信。最简单的方法是使用已建立的协议,例如 HTTP,通过创建客户端无需太多编码即可调用的 REST 服务。

大多数支持 HTTP 的框架都会创建多个在不同线程中运行的侦听器。这为您提供了开箱即用的多线程。

我建议调查一下我更喜欢 Spring Controllers。弹簧的重量相当轻。

如果您想使用这些框架,您将希望快速找到它们,并将它们合并到您的应用程序中进行编译和打包。

我建议为此研究 Maven。这是一个很大的节省时间。特别是使用原型来创建项目的文件夹结构,以及自动下载依赖项及其依赖项。

最后我的智慧之言。确保您的服务是单例无状态服务。这意味着您只创建一次对象,并且每个线程使用相同的对象。发生的垃圾收集要少得多。这在处理大量请求时会产生巨大的差异。

注意不要在这些服务中使用类级别的变量来保存状态。如果这样做,不同的线程将覆盖彼此的数据。

于 2012-10-10T08:47:49.300 回答