2

我想实施一个分布式销售点系统,有点像Point of sale app architecture advice中描述的系统。如何使用Message Broker和数据库设计分布式应用程序?

正是有了这些charachteristics分布式系统:

  • 客户是关键任务,他们应该工作,即使网络连接或服务器发生故障,但只是几天左右。
  • 客户端必须易于安装。
  • 每个客户端都有自己的本地嵌入式数据库。
  • 客户端和服务器之间的通信使用消息队列。
  • 该服务器用于备份,簿记,统计和向客户分发价格。
  • 服务器放置在互联网上。

我使用JavaDB作为数据库在Java Swing中实现客户端。

我的应用程序应该如何与消息代理和数据库进行通信?

我从来没有使用过Message Queues和Message Brokers。我的想法是,应用程序从数据库中读取数据,但写入消息代理,消息代理写入数据库并与服务器通信。或者这是一个坏主意?我应该如何解决这个问题?

因此,除了我的嵌入式数据库,我还需要找到一个消息代理,最好是一个用Java编写的消息代理,可以嵌入到我的应用程序中,以便于安装。

+0

我不擅长这个来制定答案。您可能想看看“企业集成模式”(Hohpe,Woolf,Addison-Wesley)。然而,这个要求听起来很可怕:“即使网络连接或服务器出现故障,客户端也应该能够工作,但只需几天左右”,“服务器用于分发[...]为客户提供价格。“你能保证价格不会改变,即你知道价格预先变化的日期吗? “ – mnemosyn 2010-04-06 15:51:09

+0

”我的想法是,应用程序从数据库中读取数据,但写入消息代理,消息代理写入数据库并与服务器通信。或者这是一个坏主意?...“ 这不是一个坏主意的想法,但你至少应该决定你期望使用哪个消息代理。有些人可能有预制件与数据库直接对话,否则你也应该在另一边编码... – 2010-04-06 16:04:17

+0

@mnemosyn:不,价格变化时没有日期。价格可以改变,你也可以改变客户的价格。但是,直到连接重新启动后,才会将其分发给其他客户端。 – Jonas 2010-04-06 16:19:53

回答

4

在纯技术层面上,这可能是一个好点开始:http://java.sun.com/products/jms/tutorial/

你也绝对应该拿到书的副本,“企业集成模式”这解释了所有可以使用的排队系统中的各种方式。

从你的描述,我设想了以下模式是有用的(对不起,不知道在书中所使用的术语,因为我没有它现在制作了我自己。):

  • 发布订阅:服务器将发布消息(例如更新价格信息),该消息被传递给订阅该类信息的所有客户端。您需要覆盖的一个重要案例是,在您的客户端在此类广播期间断开连接时,会发生什么情况。你必须确保它不会错过任何信息,或有办法再次赶上。

  • 失火和遗忘:一个通信伙伴(例如客户端)会发送一条消息,而不会期待任何形式的响应。排队系统将负责最终交付。这可以用于提交订单等。

  • 回电:这就像两个或更多的火灾和忘记消息在相反的方向。随后的呼叫将有一个ID,以便将该消息标记为对之前收到的特定消息的响应。提交订单时这很有用,但需要某种答案。当然,答案可能会在一天后到达,因此您需要一份未完成订单列表,这些列表可能应该对用户可见,或者列表支持个人。发送多个回复时,您必须处理不按顺序到达的邮件的情况。如果可能,处理这个问题的好方法是在每条消息中包含早期消息的所有信息。这样你可以简单地丢弃旧信息。

所以通信会像这样工作: - 服务器偶尔更新发送到所有客户端。消息可能应该包含某种版本信息,因此客户端可以确保它们具有所有消息。 - 定期(或aftger从服务器接收一段时间没有更新或...)客户端请求来自服务器的特殊更新,以确保它具有所有当前信息。上面提到的版本信息可用于识别缺失的信息 - 客户端收到消息并将内容存储在本地数据库中 - 客户端从数据库中读取信息以向用户提供信息 - 客户端提交订单或任何时间服务器,可能接收不同步的回答

一些普遍性的建议:

随着排队你在地狱并发的中间。所以,对所有可能出现“错误”的东西进行创意。例子是 - 邮件到达不按顺序 - 发送时接收器不可用(这也是首先使用邮件的原因) - 接收器不可用并且不会返回在线状态。消息传递服务器有保证传递的选项。这意味着他们必须存储消息直到实际发送消息。如果客户永远不会回到在线状态,则邮件将永远保留,填满存储空间

确保所有邮件处理与应用程序的其余部分完全分离,以便于测试。

思考升级服务器和客户端的过程,特别是当消息格式发生变化时。您或者必须在相同的时间点升级所有时间,或者您的服务器必须能够处理一段时间的新旧消息格式。

+0

谢谢你的回答!您对我的计划有何看法,即应用程序从数据库中读取并写入消息代理,并且代理将其写入数据库并与服务器通信? – Jonas 2010-04-08 10:29:12

+0

合理的声音是一个基本的想法。当然,你会发现许多问题与细节有关,但是对于所有应用于不可靠网络连接的方法来说都是如此。 – 2010-04-08 18:33:04