问题标签 [service-broker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2300 浏览

sql-server - 队列停止(禁用)而没有任何有害消息

我有一个没有任何明显原因的队列,在这个队列中我实现了一个位置消息处理。在处理过程中,它会记录并丢弃任何有害消息。

它运行良好一年多没有停止。但是最近(问题开始于四个星期前),它每周停止一次或两次。仅在本周它停止了两次。

而当我检查带有新中毒消息的表格时,没有!当我启用队列时,处理成功恢复并且“毒消息”情况不会重现。

关于队列的任务:每天大约接收2-3000条消息。它用于在事务之外运行存储过程。并且每条消息都可以持续一段时间进行处理(进行大量选择、插入、更新)。

让我解释一下这一点:数据库具有在事务内部触发的触发器,触发器发送消息以在触发器外部运行一些代码。异步行为可防止降低数据库的性能。

我检测到即使在处理消息时发生死锁,队列也会将消息视为中毒。所以原则上它不应该是一个性能问题。但是,可以吗?也许数据库正在增长并且处理消息的时间过长?

但是,如果它没有被检测为已定位,我怎么能找到它呢?
为什么队列停止的其他原因?
如何保存队列被禁用的时间和消息?
有人知道我如何进行取证分析吗?
任何想法?


更新暴露伪解决方案:
根据 Remus 的帖子,我尝试使用事件通知来获取队列停止的确切时刻。

然后检查事件日志:

但是由于很难知道事件发生的环境,(此时还有什么正在运行??),取证分析到此结束。幸运的是,我的代理服务实现将消息存储为发货日期、收货日期、处理日期……这有助于我检测到在 3 秒内队列中充斥着数百条需要很长时间才能处理的消息.

虽然我找到了一个真正的解决方案,但唯一的临时解决方案是每 x 分钟检查一次代理作业并启用它:

谢谢莱姆斯!

0 投票
2 回答
1635 浏览

sql-server - EndDialog 消息卡在 TARGET 传输队列中,会话端点处于 DISCONNECTED_OUTBOUND 状态

EndDialog 消息卡在 TARGET(远程)传输队列中。每个条目的传输状态为空白。

Initiator 实际上正在接收 EndDialog 消息并在它的一侧结束对话。

我肯定知道这一点,因为我已经在 INITIATOR 服务回复队列过程中放置​​了一个 PRINT。日志显示,由于 INITIATOR 接收到 EndDialog 消息,这些过程正在执行。

一切正常,除了在 TARGET 中,对话端点条目保持在 DO 状态,并且 EndDialog 消息也保持在 TARGET 传输队列中。

看起来 TARGET 没有从 INITIATOR 收到 enddialog 消息的 ACK。

在 TARGET 上,BROKER:CONVERSATION 跟踪显示 STARTED_INBOUND、CONVERSING、DISCONNECTED_OUTBOUND 状态。

按照配置:

目标:Windows Server 2003 R2 Standard 64 edition SP2,SQL Server 2008 SP2,Standard Edition 64-bit,数据库兼容模式 100

启动器:Windows XP SP2、SQL Server 2005 express SP2、数据库兼容模式 80。

你对如何解决这个问题有什么建议吗?

0 投票
2 回答
2926 浏览

sql-server - 我在哪里可以找到 ssbdiagnose

有没有一个地方可以让我获得这个实用程序来诊断 sql server 中的服务代理。

0 投票
2 回答
1975 浏览

sql-server-2008 - Service Broker 外部激活器...在 2 个队列上激活?

我有 2 个队列和更多队列...我想使用外部激活器从外部激活这些队列。

当我编辑 EAService.config 以激活 queue#1 时,它工作得很好。
当我编辑 EAService.config 以激活 queue#2 时,它工作得很好。

如果我将两者都放在配置中,则只有第一个列出的那个会被激活。

两个队列实际上都由同一个 exe 处理......而不起作用的例子是......

另外我不明白 id="100" 在做什么...我尝试使用相同的 # 和不同的 #... 即 100 和 101 但它没有任何区别。激活器服务仅适用于“ApplicationServiceList”中列出的第一个

帮助!

0 投票
1 回答
1566 浏览

sql-server - 指定 service_broker_guid 而不是从 NEW_BROKER 中随机获取一个

在 SQL 2008 中,有没有一种方法可以指定 service_broker_guid 而不是简单地获取通过以下方式提供给您的任何 GUID:

我们当前的(在我看来是破碎的)发布方法是恢复两个具有相互依赖关系的数据库。一种是“源”数据库,一种是星型 BI 数据库。回归测试计划的一部分是将两个数据库的备份恢复为“黄金”状态,跨越不同的服务器,甚至是同一台服务器。

我们通常不会在我们的路线中包含 BROKER_INSTANCE 变量,因为大多数地方,我们不需要它们(即 SERVICE_NAME 和 ADDRESS 的组合足以保证交付)。但是,当我们在同一个实例上运行 2 个数据库时都启用了代理,其中一个数据库将需要一个新的 BROKER_ID。此外,到这些数据库的所有路由现在都需要一个 BROKER_INSTANCE 限定符,因为在同一个 ADDRESS 上有 2 个 SERVICE_NAME。

我们使用 Visual Studio Database Professional 来生成我们的构建输出脚本,并且没有简单的方法来包含 BROKER_INSTANCE 作为其 SQLCMD 变量替换技术的一部分,除非您事先知道它。

0 投票
1 回答
3444 浏览

sql - SQL Service Broker 通知外部应用程序

在对 Service Broker 进行大量搜索之后,我遇到了这个问题和答案

我的场景与那里提到的类似,因为我在表上有一个 SQL 触发器,在这个触发器中我调用 xp_cmdshell 将主键信息传递给外部 exe。

我可以看到设置 Service Broker 队列和服务而不是在表上使用触发器的价值。据我了解,我为处理队列中的消息而设置的激活存储过程现在将包含我对 xp_cmdshell 的调用。

但是,我不知道如何将“更改表中的数据”事件作为触发事件。我希望该CREATE EVENT NOTIFICATION条款对它有ON TABLE [x] FOR [INSERT|UPDATE]一部分,但它没有。

任何指针将不胜感激。

0 投票
1 回答
1064 浏览

sql-server - 在嵌套事务中发送和接收 SQL Server Service Broker 消息

我想使用 SQL Server 2008 Service Broker 记录由存储过程动态创建的长时间运行(最多约 30 分钟)事务的进度。我有两个目标:

1) 获取组成事务的动态创建语句的实时日志记录,以便可以远程监控事务的进度,

2) 能够审查组成事务的步骤,直至可能发生故障需要回滚。

我不能简单地将 PRINT(或 RAISERROR(msg,0,0))打印到控制台,因为我想将进度消息记录到表中(并且即使存储过程回滚也保留该日志)。

但我的理解是,在发送线程提交(外部事务)之前,无法从队列中接收消息。这是真的?如果是这样,我有什么选择?

0 投票
3 回答
213 浏览

client-server - 无需轮询的客户端之间的消息传递

我有一个 MS SQL 服务器网络,它们通过连接到它们的 (C++/C#) 客户端相互连接。我正在设计一种客户端和服务器-客户端消息传递之间的消息传递方式。我已经阅读过有关 MS SQL 服务代理和其他代理(如 Apache Qpid)的信息。但我仍然不知道这是如何工作的,如果有人可以为我提供更好的资源,或者如果有人已经解决了这样的问题,我将不胜感激。

我怎么可能在客户端之间发送和接收消息?

请确保这不是学校作业或大学课程项目。

我真的很感激任何有用的评论或建议......

+++谢谢+++

0 投票
2 回答
3281 浏览

sql-server-2008 - 数据库镜像和服务代理,镜像路由不可用

我们已经有一个服务代理运行了很长一段时间(在同一台服务器上运行)。现在我们要在两台服务器之间添加数据库镜像。

为此,我们必须为服务代理创建新路由和新端点(以在故障转移的情况下支持镜像)。

我们已经在运行完全相同版本的 windows 和 sql-server 的开发环境中进行了尝试。这是:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1734.0 (X64) 2010 年 8 月 11 日 12:51:02 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.1 (Build 7600: )

一个区别是开发环境在虚拟系统中运行。

当我们在生产环境中实现这一点时,我们遇到了在开发环境中从未见过的问题。

服务代理更新变得非常缓慢,但我们可以看到一些消息通过了。

我们得到的错误信息是:

镜像路由不可用。'TCP://server1.domain.local:4022' 充当'未知' []。'TCP://server2.domain.local:4022' 充当'未知' []。

镜像路由是可操作的,但只连接到主体。“TCP://server1.domain.local:4022”充当“主体”[]。'TCP://server2.domain.local:4022' 充当'未知' []。

在我们的开发服务器上,我们收到了类似的消息:

镜像路由是可操作的。“TCP://server1.devdomain.local:4022”充当“镜像” []。“TCP://server2.devdomain.local:4022”充当“主体” []。

镜像路由是可操作的,但只连接到主体。'TCP://server1.devdomain.local:4022' 充当'未知' []。“TCP://server2.devdomain.local:4022”充当“主体”[]。

如您所见,我们收到有关镜像路由在我们的生产服务器上无法运行的消息,但在我们的开发服务器上却没有。

数据库镜像通过端口 5022 设置,服务代理设置为 4022。

如何创建路由/端点的一些示例:

当我们删除数据库镜像端点时,一切又开始正常工作。

有任何想法吗?

谢谢!

0 投票
1 回答
708 浏览

visual-studio-2010 - 如何在 VS2010 数据库项目中包含 Service Broker

我正在尝试将我的 Service Broker 队列添加到我的数据库项目中,但我并不完全清楚什么是最好的方法。我可以使用两个视图,解决方案资源管理器和架构视图。似乎获取 Service Broker 队列及其所有相关消息/服务/合同的唯一方法是在解决方案资源管理器视图中添加队列,然后在架构视图中添加其他所有内容。

它是否正确?这一切难道没有统一的看法吗?在数据库项目中包含 Service Broker 的最佳实践是什么?