在两个单独的数据库之间同步我的记录

时间:2013-07-31 10:22:25

标签: asp.net-mvc entity-framework

我正在构建基于asp.net MVC的BPM,我正在开发两个系统: -

  1. 第三方BPM。

  2. 我自己的BPM系统。

  3. 目前,当我添加新流程时,我正在执行以下操作: -

    1. 使用REST API在第三方应用程序中创建新流程。
    2. 在我自己的BPM数据库中创建一个新流程。
    3. 但我面临以下问题: -

      1. 如何添加/编辑/删除两个系统中的记录是一种一致的方式,所以如果没有在第三方系统中添加记录,我必须将其从我的系统中删除,反之亦然。
      2. 我的流程模型类是: -

        public class newprocess
            {
        
                public string name { get; set; }
                public string activityId { get; set; } 
             public string Status {get; set;}
            }
        

        我的行动方法是: -

        [HttpPost]
        public ActionResult CreateProcess(string name) {
        using (var client = new WebClient())
        {
        try
        {
        repository.CreateProcess(name,"Pending");
        repository.save();
        
        var query = HttpUtility.ParseQueryString(string.Empty);
        query["j_username"] = "kermit";
        query["hash"] = "9449B5ABCFA9AFDA36B801351ED3DF66";
        query["loginAs"] = User.Identity.Name;
        var url = new UriBuilder("http://localhost:8080/jw/web/json/Process/create/" + name.ToString() );
        url.Query = query.ToString();
        string json = client.DownloadString(url.ToString());
        var serializer = new JavaScriptSerializer();
        var myObject = serializer.Deserialize<newprocess>(json);
        string activityid = myObject.activityId;
        
        if (activityid != null)
        {
        repository.UpdateProcess(name, "Finish");
        repository.save();
        }
        

        所以我在POST动作方法中所做的是: -

        1. 在我的数据库中创建一个状态为“pending”的新记录。
        2. 调用第三方API,并获得结果。
        3. 如果ActivityID不为null(第三方系统中的创建成功),我将记录状态更新为“完成”。否则状态将保持未决状态。
        4. 我已经构建了一个显示状态为“pending”的所有记录的屏幕,管理员可以从我自己的数据库中删除它们。
        5. 我的方法也会运作良好,否则会产生我不知道的问题。或者我应该寻找一种完全不同的方法

          提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

方向看起来不错。但请记住完成周期并考虑更多选项

根据您的陈述“我在做什么”

  

1在我的数据库中创建一个状态为“pending”的新记录。

     

2调用第三方API,并获得结果。

     

3如果ActivityID不为null(第三方系统中的创建成功),我将记录状态更新为“完成”。否则状态将保持未决状态。

     

4我已经构建了一个显示状态为“pending”的所有记录的屏幕,管理员可以从我自己的数据库中删除它们。

您已经涵盖了2阶段提交的主要概念。如果一切顺利,这将没事。 但你也应该考虑。

  1. 调查是否仅从理论的角度来看“可靠的消息传递”。 在这里可能有点矫枉过正。

    1. 如果您没有收到回复怎么办?你不能认为它没有发布。 在另一方提交后,返回流量可能会丢失。 因此,您应该跟进检查存在的呼叫或手动整理。您实际上需要发布您的双方条目,而不是每次没有响应时删除它。删除当然是最有可能的。当然我不是在谈论你的一方收到的消息未发布。这是一个明确的已知状态。
  2. 如果您的待完成更改提交失败,会发生什么? 你如何恢复这种情况。 删除其他条目?或者重试你的。

  3. 当对方根本无法访问时,您还应该考虑基本模式/计划是什么。接受帖子,将许多记录为待处理,并有一个稍后重试待处理记录的进程。或者只是失败所有新呼叫,直到可以访问另一方。 至少要考虑非完美的世界情景并制定计划。

  4. 这是基本模式。手动完成其中一些操作是可以的。这是一个计划,是一种有效的模式。 当然,您可以添加工具和逻辑来帮助支持此功能。 例如错误处理,自动重试模式。异步确认等 但这是将它带到企业级别。以企业成本。

    基本上如果采取立场,ONE系统负责整体完整性和持续同步。这是最好的起点。你有。您的系统是Orchestrator,负责同步结果。