【问题标题】:NServiceBus, NHibernate, and GuidComb()NServiceBus、NHibernate 和 GuidComb()
【发布时间】:2011-01-13 09:57:56
【问题描述】:

免责声明:这是来自my other question about NServiceBus 的后续问题answered very thoroughly

我目前的问题是:如果一个网站被构建为像上面提到的文章那样“愚蠢”,那么下面的场景是如何工作的?

用户通过填写​​包含相关详细信息的表单在网站上注册。当用户单击表单上的“提交”按钮时,Web 应用程序获取表单数据并创建一条消息,它使用 NServiceBus 和 Bus.Send() 将其发送到应用程序层。应用层负责创建新用户并发布用户已创建的事件(Bus.Publish()),以便其他进程可以做他们的事情(给新用户发送电子邮件,将用户添加到搜索索引等)。

现在,由于本场景中的 Web 应用程序完全依赖应用程序层来创建新的用户实例,它如何知道用户的 id?如果在这种情况下我没有使用 NServiceBus,而是让网站发出对 DAL 的进程内调用,我将使用 NHibernate 的 GuidComb() 策略为新用户创建标识符,然后再将新行保留在数据库。如果接收到创建新用户的命令的消息处理程序应用程序(在当前场景中)使用相同的策略,那么 userId 是如何传回 Web 应用程序的?

在这种情况下,我是否必须采用不同的策略来管理标识符?

【问题讨论】:

    标签: nhibernate nservicebus identifier


    【解决方案1】:

    您可以随意想出一个 ID 用作correlation identifier,只需将其放入 Web 应用程序的消息中,即可在消息启动的任何进程中携带它。

    这样,您可以将请求与系统周围的其他事件关联起来,前提是它们记得提供关联 ID。

    但听起来您希望您的用户 ID在同一个 Web 请求中反馈给您 - 这不能通过异步后端轻松完成,而这正是消息传递给您的。 p>

    是否可以在创建用户后向用户发送一封电子邮件,其中包含指向某种网关的(秘密)链接,以恢复用户的会话?

    【讨论】:

    • 你好。这是一个好主意,我使用了与异常屏蔽类似的东西,其中一个错误在两个系统之间进行通信,并在每个系统中使用不同的标识符保持不变。但是,在这种情况下 - 相关标识符的寿命是多少?我不一定需要在同一个 Web 请求中将用户 ID 反馈给我 - 但我希望能够在系统中尽可能多地使用实际的用户 ID,而不是使用它和相关 ID组合。否则我将不得不对两个 id 进行索引...嗯!深思熟虑。好建议。谢谢!
    • 您应该使用关联 ID 来关联与创建用户的过程相关的消息/事件。
    • 一旦创建了用户,并且用户 ID 已知,我会说相关 ID 应该被丢弃,因为它是创建用户过程的“本地”。
    • 尝试并设计您的命令,使它们没有失败的充分理由。即让您的网站验证用户选择的用户名是否有效且可用。然后使用该用户名进行关联。这有意义吗?
    • 感谢所有额外的 cmets。我一整天都在看这个,我认为这可以工作。无论如何,在她确认她的电子邮件地址之前,用户几乎没有任何权利,因此在此之前她根本不会创建或更改任何数据。所以我可以在那个时候换掉相关ID。不错!
    【解决方案2】:

    UI 不能为“用户创建”事件监听总线吗?然后,您可以通过让事件包含某种事件 ID 链接回“用户创建请求”事件或与事件中的一些其他众所周知的数据(如用户名)进行关联。尽管您可能还必须监听多个事件,例如“用户创建失败”事件。

    这与 Web 浏览器中的正常 AJAX 处理没有什么不同。从技术上讲,您不会阻止对 Web 服务器的带外回呼。您调用调用并异步等待回调。

    【讨论】:

    • 为了让它工作,但是,线程必须保持活动状态,不是吗?我认为这是不行的,但我很高兴能得到纠正。
    • 好的,假设这是一个 ASP.NET WebForms 页面。页面内的异步处理的概念已经存在。例如,您可能会启动 3 个 SQL 命令并等待它们全部完成的想法(想法是同时执行它们而不是连续执行它们。通常,等待异步响应会有某种超时。如果超时是超过,你仍然可以有某种刷新选项,它只是重新订阅并再次等待响应消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多