实时分布式系统的基本要素是什么?

31

我正在尝试成为一名承包商,今天进行了第一轮承包商职位的面试。虽然我通过了面试,但被告知 - 作为主要的UI开发人员 - 我只涵盖了他们需要的后端基础知识,并且在第二轮面试前应该阅读有关分布式系统的内容。

到目前为止,在我的职业生涯中,我一直在进行后期操作,从未需要实时处理。 由于我只剩下几天时间,哪些主题是必须的?首先要能够回答他的问题并被视为分布式系统方面的合格人选?

问题是如何在UI界面上展示接近实时的数据?后端需要做些什么?我提到了实时数据流的生产者/消费者模式。他喜欢这个想法,但他说他需要更多的信息。

真的很感谢任何帮助,


1
谢谢你的好问题Houman,我发起了一个悬赏以吸引更多关注并获得一些更新的答案。 - Ersoy
2个回答

45

分布式实时系统的基本要素是什么?

一个分布式实时系统由问题域或解决方案域(或两者)强加的两个具有挑战性的特性组成。

分布式

一个分布式系统通过一种通信机制连接多个具有本地属性的独立计算实体。因此,算法和其他设计组件必须考虑到同步故障模型。关于分布式计算问题的一个有用总结(不完全客观)包括在Deutsch的八个谬论中。(参见这个有用的阐述。)所有这些都有助于在(实时)分布式设计中进行考虑;每个都是基本的设计和实现关注点的出发点:

  1. 网络是可靠的
  2. 延迟时间为零
  3. 带宽是无限的
  4. 网络是安全的
  5. 拓扑结构不会改变
  6. 有一个管理员
  7. 传输成本为零
  8. 网络是同质的

实时

实时系统是一种要求操作完成时间的准确性是该系统功能需求和正确性度量的系统。 (我在这里打开了一个SO问题,试图澄清这一点。)事实上,几乎所有系统都可以被认为是“软件”实时系统,因为通常存在未明示的对操作时间的要求/期望。我们将实时术语保留下来,有时加上软实时硬实时,用于不满足时间约束条件时则是错误的系统。请注意,上述谬论总结的许多关注点与时间相关。 (另请参见real-time tag wiki

值得注意的是,RT(和DRT)系统存在一系列要求的连续性,在一个极端是“确定性”(或传统上的硬实时)。然而,许多系统具有非常重要的时间约束,但仍然是不确定性的。特别是在DRT系统的背景下,区分活动紧急性和活动优先级也很有用。在延迟和故障是真实且非平凡的因素的大型系统中,显式地管理计算和通信资源来实现及时性和其他设计要求变得更加重要,这两个维度的分离变得重要。

实时分布式系统的组合

  • 明确的时间要求 - 要求是什么,它们如何映射到活动中,是否为跨节点的真正时间性要求,如何在设计和实现中明确表示时间限制,以及如何检测、报告和恢复故障?
  • 时间同步 - 实现时钟同步的要求和机制是什么? 有关钟同步的Wiki页面(clock synchronization); 许多应用程序只需要NTP; 更严格的要求可能需要特殊硬件(例如IRIG-B)或方法。
  • 同步要求 - 什么是约束和系统同步的要求? 这与时钟同步有关,但并不相同。Doug Jensen提供了一些关于形式化模型的思考(thoughts on formal models from Doug Jensen); 维基百科上有关于异步系统同步系统的信息; StackOverflow上有关于部分事件排序的问题(SO question on partial event ordering);
  • 设计模式 - 有哪些组成部分,它们如何在传输过程中相互关联?(特别是这些关系如何影响时间性?)
  • 中间件 - 您将如何编码系统的分布方面?例如实时CORBA(这是OIS的一个很好的页面)或DDS
  • 时间限制 - 您将如何记录、衡量和强制执行系统中的时间限制?
  • 部分故障 - 实时系统通常具有可靠性要求。分布式系统的一个独特之处是可能出现整个类别的故障,称为“部分”故障,由于真正的崩溃/通信故障或必须视为故障的时间性错误。StackOverflow上有关于容错方法的问题(SO question on failover approaches);
  • RTOS - 将使用哪些实时操作系统?

一些参考资料

如果想要了解相对传统的DRT系统,请参考Kopetz的书。如果想要更加动态的视角,则建议阅读Jensen的论文以及他的网站。在Java领域中,强烈推荐阅读优秀的“可靠分布式编程简介”。这本书虽然没有涵盖所有时序问题,但是对于局部故障有着特别清晰的表述。

最近,(不可靠)故障检测器的概念成为有用的同步构造,在DRT系统的理论推理和实际制定/设计/构造技术方面能够提供帮助。关于该主题的里程碑论文是Aguilera、Le Lann和Toueg所著的“关于快速故障检测器对实时容错系统的影响”。该论文难度较大,但是能够让每一分智力投入都有所回报。


我想知道今天对这篇文章的更新看法会是什么样子? - qxotk

1

在高层次上,从后端到前端获取实时数据有两种基本方式:

  • 推送:您可以通过发送消息将数据“推送”到客户端。我过去曾使用这种方法向客户端发送进程间消息,以通知UI更新已发生。这是传输信息的最快方式,但存在一些复杂性。例如,除非使用Flash、Silverlight等技术,否则无法将IPC消息发送到Web应用程序。此外,您需要对这些消息进行节流,因为如果发送太多,可能会使UI响应速度变慢。在这里要研究的一些技术包括MSMQ、TCP/IP和WCF等。

  • 拉取:您的UI可以定期从后端请求数据。这种方法的优点是在UI上很容易编码:只需每隔X轮询一次数据源即可。但当然,明显的缺点是更新发生和应用程序接收到该更新之间存在延迟。这对于实时处理可能是不可接受的。无论如何,在此模型中,您可能会调用Web服务或对数据库进行调用。

当然,这只是起点。两种方法都可以使用,数据可以缓存在客户端等。这完全取决于应用程序的需求。


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