实现远程事件驱动系统需要哪些元素?- 概述

3
我正在尝试设计一个事件驱动的系统,其中该系统的组成部分通过生成事件来相互通信,并由系统的其他组件响应这些事件。组件将独立于彼此,或者说尽可能地独立于彼此。该系统最初将在Windows 7上实现,并使用Delphi编写。由Delphi代码生成事件。我知道如何在单台计算机上实现所描述的类型的系统。
我希望设计该系统,使其能够轻松部署在不同的机器体系结构上,特别是运行在分布式体系结构上的不同组件,这可能与Windows 7不同。该系统不需要与任何外部系统进行通信。
我已经尝试调查我需要考虑的架构,并查看了下面提到的问题。这些问题似乎指向利用命名管道作为硬件间通信的机制。作为这些调查的结果,我勾勒出了以下内容来描述我的系统 - 图表的第一部分是我正在开发的系统; 第二部分是我所推断的可能需要的未来实施。
这导致以下几点:
  1. 您可以通过命名管道传递事件吗?
  2. 这是否是解决这个问题的适当和明智的结构?
  3. 有更好的替代方案吗?
  4. 我忘记了什么(在这个粒度水平上)?
请注意,不要删除任何HTML标记。
参考链接: How is event driven programming implemented? How do I send a string from one instance of my Delphi program to another?

@S.Lott 正如问题所述,我最初是为 Windows 7 开发它。未来的实现可能涉及将 UI 元素基于 Web 进行,针对托管在 Linux 服务器上的后端运行。我希望以这样的方式设计它,以便不会对此类未来发展造成障碍。 - Chris Walton
抱歉。标签通常包括操作系统。我不确定为什么标签中省略了操作系统。 - S.Lott
事件的数量有多少?每秒钟有多少个?每个事件关联了多少数据?要保留多少历史记录? - S.Lott
1
当涉及到不同的架构时,您可能会面临与其他架构对管道的期望相关的挑战。当我使用命名管道(2002年?)时,我正在与RS/400或类似的东西进行通信,虽然我的Delphi管道客户端和测试服务器可以正常通信(在不同的机器上运行),但我无法与RS/400建立连接。它一直在等待管道上的额外字节/字符。在VB6中组合的简单管道客户端(呜呜)在一次尝试中就起作用了……事情可能已经改变了,但是使用管道而不是基于TCP/IP的通信时要牢记这一点。 - Marjan Venema
@Marjan - 需要记住的有价值的要点。我可能需要将TCP/IP(这是否自动意味着套接字?)作为主要机制来考虑。 - Chris Walton
显示剩余3条评论
4个回答

3
为了最大程度地提高部署灵活性(与操作系统无关),我建议看一下流行的开源消息代理,它们运行在Java平台上。使用标准协议,它们能很好地集成Delphi和其他编程语言,可以用于Web应用程序,并拥有庞大的已安装用户群和活跃的社区。
它们相当容易在几分钟内安装和配置,并且有免费/商业客户端可供Delphi使用。
一些示例包括:
- Apache ActiveMQ - OpenMQ - JBoss HornetQ
我还推荐Martin Fowler的书《企业集成模式》作为概述和介绍,其中包含许多简单的配方来处理特定问题。
请注意,我是一名商业Delphi客户端开发人员,专门为企业消息系统开发,例如xmlBlaster,RabbitMQ,Amazon Simple Queue Service以及上述三个代理。

我想问一下,您是否假设所有这些消息代理都将处理事件 - 这可能看起来很基础,但这是我不清楚的一个点。 - Chris Walton
1
消息代理通常用于传输简单的数据类型或键/值映射以保持性能,但也可以传输序列化对象 - 如果事件是可序列化的或可以用简单的数据类型表示,代理可以处理它们。 - mjn

2
我只能回答你的第4个问题:您尚未决定事件是同步还是异步。在异步情况下,当消息到达时,您必须决定要做什么。您有一个队列吗?队列有多大?可以随意获取队列中的任意元素吗,还是严格按照FIFO顺序?如果消息丢失会发生什么(某人断开网络电缆)?
在同步变体中,优点是您得到了交付保证,但是如果连接突然丢失,您该怎么办?
连接丢失将是一个问题。您拥有的机器越多,出现这种情况的可能性就越大。请决定如何处理它。
另一个问题可能是,如果您有一个大事件和几个小事件,您该怎么办。传输顺序是FIFO还是最小优先?事件可以重新排序吗?这里有什么假设?
此外我经常使用Erlang进行编程。在Erlang中,所有事件处理都已经解决了,但这也意味着为您选择了特定的模型(异步,无界队列,没有交付保证,但可以检测到连接丢失)。

1

我建议看一下RabbitMQ,http://www.rabbitmq.com/。它有服务器和客户端。只需要在Delphi中编写一些包装代码,您就可以准备构建您的业务逻辑了。

祝好


您可以使用由mjn提到的组件来实现这一点。它们非常好用。 - Jeroen Wiert Pluimers

0

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