我正在寻找一个相当直接的基于 WCF 的服务,我有一个关于如何最好地将它与数据库分离的问题。
背景:我将要实现的服务非常关键,地理分布,并且需要在灾难或数据库故障时尽可能可用。业务逻辑非常简单;它从外部源接收事件,维护状态表,并将处理后的更新广播到连接的客户端。我正在替换目前每秒处理 400-600 个传入事件以及大约 10-20 个并发连接的客户端的服务。该服务的多个实例将在美国多个地点运行。所有实例都承载相同的状态数据并共享事件。在一个位置有一个主 (SQL Server 2008) 数据库实例。
挑战:过去我已经构建了许多与此类似的应用程序,并且我已经克服了大部分架构障碍。但是我遇到了一个挑战,我不禁想象有一个更好的解决方案:在我的设计中,数据库(MSSQL)仅用于持久性;只有在服务的第一个实例启动和离线报告时才会读取数据库。在正常操作期间,应用程序只会将历史数据写入数据库。
为了将应用程序与数据库完全分离,过去我使用过 SQL Service Broker:在每个运行该服务的服务器上,我安装了一个 SQL Server Express 实例,该实例基本上只是充当 Service Broker 消息到核心的队列( SSB“目标”)数据库。在正常操作条件下,应用程序对本地实例执行所有 SQL 操作,本地实例通过 SSB 将它们排队/转发到目标数据库。这工作得很好,老实说,我对它相当满意......只要 SQL Server Express 的本地实例启动,应用程序显然不会意识到目标数据库的问题,它和它之间的网络问题目标数据库等,并且在局部灾难的情况下具有很高的生存能力。它很容易监控,设置起来也不会太难看,而且它' 都支持。简而言之,它有效,如果必须的话,我很乐意接受它。
但这让我觉得有点杂乱无章。感觉应该有更好的方法来做到这一点。
显然,一种选择是仅将正在进行的数据库操作排队。我不喜欢这样,因为如果我要完全解耦,我更愿意真正解耦并使我的应用程序本身尽可能远离数据库。我还可以编写一个数据服务来对这些操作进行排队……实际上,我在思考自己之前曾短暂地沿着这条路走下去,“等等,这不是 SSB 已经在做的吗?”
由于不可更改的外部约束,更健壮/HA SQL Server 体系结构不是一个选项。我已经获得了我的一个数据库集群,仅此而已。
所以我对任何想法和/或批评持开放态度。我有什么明显的遗漏吗?这感觉就像是我只是以某种方式忽略了一些简单的东西(尽管不是因为缺乏搜索)。我在这里犯了某种更广泛的架构错误吗?
提前致谢!