AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 18355
Accepted
fa1c0n3r
fa1c0n3r
Asked: 2012-05-25 01:54:24 +0800 CST2012-05-25 01:54:24 +0800 CST 2012-05-25 01:54:24 +0800 CST

您将如何为 Service Broker 队列的多个用户实施对话组/锁定?

  • 772

您如何使用他们自己的用户应用程序实例为多个用户实施对话组,但将相关消息发送到服务代理队列?这种实现有什么好的例子吗?原以为可以自己设置对话组ID,保证各个用户的某组消息是相关的,但是好像这个值会自动生成为UNIQUEIDENTIFIERS...这还是最好的办法吗去做吧?

我想确保捕获并锁定相关消息,例如“同一团队”的两个用户一起竞标同一个项目,以便服务器应用程序逻辑可以一起正确处理这些相关消息(基本上只有第一个将被接受,而第二个将被拒绝,直到用户的视图可以更新,以便他们知道另一个用户已经更改了出价)。

流向是从用户 A、B、C 向队列发送 xml 消息,然后是出队服务,该服务将 xml 发送到外部 Web 服务。我们发送的消息是结构化的 xml 消息,这些消息将在出队后修改外部 Web 服务上不同项目的订单。

谢谢!

sql-server sql-server-2008
  • 1 1 个回答
  • 2148 Views

1 个回答

  • Voted
  1. Best Answer
    Remus Rusanu
    2012-05-25T04:08:00+08:002012-05-25T04:08:00+08:00

    如果您正在尝试这样做,您不能使用对话组来排除应用程序实例。如果 Instance A 只需要为 Instance A 接收来自队列的消息,而 Instance B 只需要为 Instance B 接收消息,那么instance A 需要使用 queue A 而 instance B 需要使用 queue B。仅当实例 A 和实例 B 都可以处理任何消息,但您希望将它们排除在并发处理相关消息之外时,才可以使用会话组。每次我看到有人试图预先生成对话组 ID,这个想法总是很糟糕。

    更新

    发起者无法控制目的地(目标)的会话组。即使 A 和 B 在发起者站点的同一个会话组中,这并不意味着它们在目标站点上是相同的,因为会话组是一个本地概念并且不会随消息一起传播。如果您希望 A 和 B 发送的消息属于目标端的同一对话组,则必须以“相反”的顺序开始对话:目标开始对话并将它们放在一个对话组,然后目标开始在此对话上发送消息。因此,对话就像发送消息的“邀请”,逻辑“目标”充当实际的“发起者”。

    更新#2。

    从理论上讲,这就是它的工作原理:假设您有 10000 种产品。要执行“反向”模式,当用户想要参与应用程序时,它需要“加入”。因此他开始与服务器进行对话并发送消息“我想加入”(称为“对话 0” ')。服务器通过与每个产品的新用户开始对话来处理此消息. 现在用户有 10000 个对话,它可以发送“出价”。对于产品 A,它使用会话 1,对于产品 B 会话 2 等。当用户 B 想要加入时,它也会开始与服务器的新会话并发送“我想加入”消息。服务器通过与该新用户开始 10000 次对话来响应,每个产品再次对话一次,并确保每个人都在产品的相应组中,因此产品 A 与用户 1 的对话与产品对话在同一组中a 用于用户 2。

    现在显然任何人都会认为这个方案是有缺陷的:它需要 number_of_products X number_of_user 对话,它使添加和删除产品变得很痛苦(必须维护所有这些用户对话!)等等。一种替代方法是每次对话多路复用产品。假设服务器只与每个用户开始 10 次对话,并且用户使用与产品 id 的最后一位数字对应的对话(因此产品 1 进入对话 1,但产品 11 或 101 也是如此)。这是更可行的,它需要更少的对话,并且在添加或删除产品时不需要特殊的对话管理。您可能会认为这是一个缺点,因为现在服务器锁定的不是产品 1 的所有消息,而是产品 11 的所有消息、所有 101 等的消息,但请考虑这一点:只有当您有服务器上的处理线程数超过每个用户的会话数。如果您有 5 个线程,那么锁定 1、11、101 无关紧要,其他 4 个线程仍有消息要处理。仅当您有 11 个线程时才重要,因为第 11 个线程没有要处理的内容。

    现在我不提倡完全部署这个,我只是指出一些可能性。在大多数情况下,CG 锁定将针对每个用户,而不是每个产品,并且添加使用 CG 锁定以避免每个产品上的并发问题的额外维度有点不正统。

    并且不要忘记,在 SSB 中保证顺序的唯一构造是对话。因此,如果用户必须在会话 1 上发送对 A 的出价,然后在会话 2 上发送对 B 的出价,则不能保证在处理B 的出价后会处理对 A的出价。唯一的保证是,如果用户 1 为 A 发送了两次出价,它们将按照发送的顺序进行处理。

    此外,如果两个不同的用户为产品 A 发送投标,则无法保证这些投标的处理顺序。但是,如果产品 A 的投标最终出现在相同的 CG 上,则可以保证只有一个“处理器线程”会同时看到用户 1 的投标和用户 2 的投标,但要小心,因为不能保证投标在 RECEIVE 结果集中按照它们被接收的顺序呈现。RECEIVE 仅保证:

    • 结果集中的所有消息都来自同一个CG
    • 属于对话的消息是有序的

    但结果中的对话顺序基本上是随机的(由对话句柄顺序驱动,一个 GUID)。

    在我忘记之前:请记住,还存在MOVE CONVERSATION但依赖 MOVE(而不是直接在正确的 CG 中开始对话)非常容易陷入僵局。

    • 2

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve