2

我将开发实时应用程序,它将接收股票市场数据并进行一些处理,然后传播到客户端应用程序。我决定在服务器和客户端之间划分计算,服务器将进行基本计算,然后将基本数据发送到计算最终变量的客户端。

我决定使用 C# 开发客户端应用程序(仅限 GUI)和使用 C++ 计算最终变量的组件(称为:变量计算器)。在 C++ 中开发“变量计算器”的目的是为了模块化。例如,如果我发现变量计算在客户端需要更多时间,我可以在服务器端使用相同的模块。

此外,我将使用标准 C++ 开发服务器端。

注意:服务器应处理一组消息并在不到一秒的时间内将其发送给客户端 最大消息数出现在市场开始时 100,000 条消息

有什么建议么?

4

11 回答 11

6

我不同意“实时”是一个模糊的定义。更有可能的是,人们只是不明白这是什么意思。实时是指系统的响应时间与现实世界的系统相同。您实际上可以让系统比实时更快,从而导致类似于让系统比实时慢的问题。

因此,我不相信您在参考“实时”应用程序时要求使用语言,就像对于真正快速的应用程序一样。

查看语言枪战,看看在最接近您的设计空间的各种测试中什么做得最好;但是,我的直觉答案是使用 C。

于 2008-12-29T12:04:49.930 回答
6

曾在投资银行工作近30年。我写过很多这样的应用程序。您需要解决的潜在问题可能不是实时性能,而是延迟和吞吐量。

在这种情况下,延迟是关于减少网络延迟,语言选择不是很相关。

吞吐量是关于长时间维持的大处理能力,而性能是关于短时间内非常大的处理能力。尽管在这种情况下语言选择比延迟更重要,但它通常并不像您想象的那么重要。

在这两者中,通常最好先设计尽可能低的延迟。吞吐量问题可以通过各种技巧在以后的开发中解决,但摆脱现有设计中的高延迟要困难得多。

所以我会在客户端和服务器上都使用 C#,至少在概念验证方面是这样。没有必要引入额外的复杂性(另一种语言)来解决可能不重要的问题。

编辑:我注意到您编辑了您的问题,说服务器需要在不超过 1 秒的时间内处理多达 100K 条消息。我怀疑您是否可以通过软件来实现这一点,但您可能可以通过使用软件和硬件的组合来实现

如果您确实需要这种级别的低延迟(并且我在 30 年的业务中从未需要它),那么语言选择并不像拥有非常高的带宽以及超级优化和并行化一样重要算法。但我首先会质疑要求看他们真正的意思——我敢打赌这不是他们所说的。

于 2008-12-29T12:08:54.133 回答
6

您必须使用的实时约束到底是什么?微秒、毫秒、秒?

它真的需要实时,还是仅仅需要高性能?

假设它确实需要实时,那么语言不太可能是系统中最重要的东西,而且您很可能会受到运行时环境的其余部分的限制。例如:您使用的库、网络堆栈、网络协议、操作系统、CPU 架构、内存、缓存等。

综上所述,C 语言可能会给您提供易用性和了解底层系统在做什么的最佳组合。如果你非常了解 C++,那么它也适合与严格的编码标准一起使用。如果它具有极高的性能,或者具有极高的可预测性要求,那么您可能需要使用汇编代码,但这不太可能,而且编译器可能比您对 CPU 管道有更好的理解,而且它对于超过几千行代码的任何事情都是不切实际的。

当然,如果您只需要相对较快的速度,那么我不认为实时性应该是您在选择语言时的首要考虑因素,而是合适的库和工具的可用性、开发人员团队的经验、对应用程序的适用性等将是更重要的考虑因素。

于 2008-12-29T12:17:58.827 回答
3

如今,什么是“实时”应用程序的定义相当模糊。您的实时限制可能是数微秒,具体取决于应用程序,您对语言、操作系统和工具的选择都取决于这些因素。

在这种情况下,我不明白为什么您也不应该在服务器端使用 C#。也许有你没有提到的限制,但从你所说的来看,我认为没有理由在你的问题中引入第二语言。

于 2008-12-29T11:39:47.733 回答
2

如今,当涉及到不需要大量处理能力的客户端/服务器应用程序时,语言选择 imo 的重要性不如它使用的语言那么重要。只要您知道如何构建良好的体系结构,Java、C#、C/C++ 的性能类似(显然本地语言会有一些优势)。我会考虑易用性和每种语言可用的有用库的数量来做出决定。我不知道您的计算究竟需要什么或您正在处理什么库存信息,但请查看库和 GUI 开发工具,然后从那里开始......

于 2008-12-29T11:37:21.983 回答
2

Scala、Erlang 或 Java。但我强烈建议使用 Scala,因为它有很好的语法和高可扩展性。

于 2011-10-08T09:13:43.847 回答
1

我会看看 Erlang !他们的架构似乎非常适合这样的应用程序。

于 2008-12-29T12:35:29.087 回答
0

您可以查看Adaptive Communications Environment,这是一个可移植的服务器框架,用于用 C++ 编写高性能服务器。 这篇 Stackoverflow 帖子有一系列链接来描述它并散布到各种资源。

于 2008-12-29T12:19:20.307 回答
0

Dan 的直觉回答是错误的,看看他发布的网站就很清楚现在 C++(gnu/intel 实现)如何优于 C 实现

于 2008-12-29T12:31:55.943 回答
0

如果您真的想要低延迟和高吞吐量,我建议您删除服务器内的任何数据处理(计算)。如果您真的想要/需要不在客户端上进行计算,我会设置另一台服务器来提供派生数据的补充数据流。也就是说,您的计算值基于原始/原始 Feed。

你在说什么类型的计算?

您打算如何处理网络和网络堆栈中的吞吐量?你有延迟测量工具/嗅探器/endace卡吗?

于 2008-12-29T14:57:13.530 回答
0

我也实现过这样的系统,我觉得RoadWarrior其实总结的很好。

这是消息队列的绝佳应用领域,如果您利用良好的底层 MQ 技术,我相信您几乎可以在任何编程语言甚至更高级别的解释语言中满足您的吞吐量要求。

于 2008-12-29T15:47:36.050 回答