设计问题:从低延迟的C++应用程序更新数据库

3
我正在开发一个C++低延迟应用程序。我还需要更新处理的数据库和所有状态更改。为了节省调用数据库更新所涉及的延迟,我在我的应用程序中使用本地数据结构(内存中)。但是我仍然需要更新数据库。我应该为更新数据库使用单独的线程吗?如何节省数据库延迟并保持数据库最新?

如果您提供了更多的背景信息,那么帮助您会更容易。您的应用程序是什么?您在数据库中存储了什么? - Xirdus
您需要数据库实时更新吗?如果不需要,为什么不定期离线同步本地数据呢? - Nim
该应用程序是一个交易引擎。我需要保持数据库更新并使其具有抗故障能力。允许延迟的数据库更新,但不能错过。因此,我正在寻找一种中间层,在这个中间层中,我可以仅转储数据库更新并继续进行(某些其他线程会自动更新到主数据库)。是否有此类解决方案? - Groovy
3个回答

6
为了最小化延迟,您肯定需要一个数据库线程(我将其称为DBT)。 但是,如果更新频繁,则需要缓冲更改,并让DBT在将它们推送到实际数据库之前合并尽可能多的更新。如果player.x = 1,那么player.x = 2,DBT可以跳过第一个更新。 如果更新非常快且数据集不庞大,则可以考虑定期进行完整转储而不是运行更新。例如,像每60秒“保存”您正在执行的操作,而不是向数据库发送完成的所有操作列表。 答案在很大程度上取决于您正在做什么。这里没有通用的答案。

我以前从没有听过任何声望超过100的人这么说过! - Mooing Duck
@Mooing:我不挑剔回复的方式 ;) - Lightness Races in Orbit
数据库线程(DBT)正是我正在寻找的。有没有现成的解决方案?请分享更多关于此的想法。 - Groovy
@Ashish Grover:有很多线程库,比如http://www.boost.org/doc/libs/1_47_0/doc/html/thread.html。 - Mooing Duck
关于实现数据库推送,您可能需要编写自己的线程。很难找到一个特定于您所做的事情的库。 - Mooing Duck

0

有一个绝对好的解决方案:尽可能少地保存到数据库。你不必每秒钟都调用保存,大多数情况下,你可以安全地每分钟甚至更少地调用一次DB。


不,这并不总是明智的。如果数据是关键任务且需要抗故障能力怎么办?如果您的进程出现问题或sqld崩溃,您可能会丢失最近一分钟(甚至更多)的所有数据。 - Lightness Races in Orbit
如果您正在进行低延迟操作,且不能在保存之间设置长时间间隔,则您已经知道解决方案;否则您不会得到那份工作。我认为这个问题与游戏有关 - 在游戏中,即使失去十分钟也不会有太大影响。 - Xirdus
是的,数据库更新不能被错过。它们可以被延迟,但是它们需要对故障具有弹性。 - Groovy
@Xirdus:对于这个问题,“你应该已经知道如何做了”不是一个有效的答案。而且你怎么会认为这与游戏有关呢? - Lightness Races in Orbit

0

结合给出的答案并应用我的想法,我正在考虑实施以下策略: - 在运行时更新本地数据结构并将其转储到文件而不是数据库 - 一个单独的线程用于从文件读取并将其转储到数据库(实际上必须获取锁定并移动现有文件并将内容复制到数据库)

你怎么看? 这种解决方案是否存在漏洞?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接