C++ 后端基础设施

标签 c++ qt backend

<分区>

我们有非常复杂的 C++ 图像处理引擎,使用英特尔编译器、OpenCV 等。 目前,它正在通过 C# 互操作层集成到我们的产品中,该层非常薄,几乎不会影响速度性能(我们说的是每个请求只需几毫秒)。现在我们正计划将我们的系统迁移到 CentOS(并且仍然支持 Windows 平台)。从历史上看,我对 Mono 不太信任,JNI 也有其问题,因此最合乎逻辑的解决方案是转向纯 C++ 实现。

考虑到我们需要移植以下功能,您认为这是个好主意吗:

1) 文件系统 2)JSON 3)线程 4) Storm /卡夫卡/RabbitMq 5) XML 6) 日志2Cxx

顺便说一下,我可能想到 Qt,我们不需要 UI,但它会为我们涵盖文件系统、线程、XML 甚至 JSON。

非常感谢, 帕维尔

最佳答案

很有可能您的信用卡付款是由运行 Qt 核心的系统处理的,因此您的选择是正确的。

Qt 是模块化的。您需要几个排除 GUI 内容的模块,尽管 GUI 在服务器中也是可用的。例如,绘制一些图像以发送回客户端非常容易。我会建议尽可能使用 Qt,只有在 Qt 不提供您需要的东西并且不能以简单的方式实现时才回退到 Boost。如果您在 Qt 和 boost 之间犹豫不决,您最终会得到很多胶水代码,这将使整个事情比必要的工作更多。

Qt 本身没有日志记录机制,它有一些用于调试输出的工具,但如果你想要真正的日志记录,它需要更多。它确实涵盖了文件系统、json、线程、网络、使用事件队列和/或信号槽连接的对象之间的通信。它还具有流式 XML 解析器。您可以将您的项目与 log2xx 集成。由于 Qt 不提供,因此还需要集成持久的消息传递基础结构。您可能会发现,就消息传递而言,更容易实现您所需要的。

询问线程的速度开销有点毫无意义,因为在几乎所有框架中,线程 Controller 只是在线程中启动用户代码的一种方式。一旦创建线程,它就没有运行时开销。一切都取决于您在线程中运行的代码。

因此,您想问的是,您通常会在线程中“运行”什么代码?理想情况下,您只想运行 QThread 的默认实现中提供的事件循环。只有当您从其他线程向它发送消息时,事件循环才会与其他线程同步。这就是线程间通信的任何其他实现无论如何都会做的事情,因此没有额外的 Qt 特定开销。然后将 QObjects 移动到要运行它们的线程中(或者简单地在已经在该线程中运行的代码中创建)。

当您必须封装阻塞的第三方代码时,例如臭名昭​​著的阻塞数据库接口(interface),您将被迫将每个数据库连接放在自己的线程中。无论您是否使用 Qt 都会出现这种情况,因此没有什么特别之处。

Qt 的 XML 和 json 实现是合理的,我不明白为什么它们会比其他任何东西差得多。

如果您认真对待自己的项目,您就会成为 Digia 的客户。我相信他们会回答您有关所提供的支持级别、稳定性等方面的问题。

在您的项目中使用 Qt 的一个好处是它是跨平台的:您可以在 Linux 或 Windows 服务器上运行它。如果是第三方安装的系统,这可能是一个重要的考虑因素。

关于C++ 后端基础设施,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18643394/

相关文章:

c++ - #include QtWebKit (Qt4) 或 QtWebKitWidgets (Qt<5.6) 或 QtWebEngineWidgets (Qt>=5.6)

node.js - 如何使用 Mongoose 交易防止 "Given transaction number 1 does not match any in-progress transactions"?

当前 MultipartFile 的 java.io.FileNotFoundException

iphone - 自己的后端与 BaaS

c++ - 如何获得大对齐的 block ?

c++ - ifstream/ofstream真的是用来序列化的吗?

C++ 什么是 std::shared_future 和 std::promise

c++ - Visual Studios 忽略文件

c++ - pdf到qt或c++中的文本转换

c++ - 如何在 QTextEdit 面板中附加选择查询结果?