问题标签 [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.
sql-server - 队列停止(禁用)而没有任何有害消息
我有一个没有任何明显原因的队列,在这个队列中我实现了一个位置消息处理。在处理过程中,它会记录并丢弃任何有害消息。
它运行良好一年多没有停止。但是最近(问题开始于四个星期前),它每周停止一次或两次。仅在本周它停止了两次。
而当我检查带有新中毒消息的表格时,没有!当我启用队列时,处理成功恢复并且“毒消息”情况不会重现。
关于队列的任务:每天大约接收2-3000条消息。它用于在事务之外运行存储过程。并且每条消息都可以持续一段时间进行处理(进行大量选择、插入、更新)。
让我解释一下这一点:数据库具有在事务内部触发的触发器,触发器发送消息以在触发器外部运行一些代码。异步行为可防止降低数据库的性能。
我检测到即使在处理消息时发生死锁,队列也会将消息视为中毒。所以原则上它不应该是一个性能问题。但是,可以吗?也许数据库正在增长并且处理消息的时间过长?
但是,如果它没有被检测为已定位,我怎么能找到它呢?
为什么队列停止的其他原因?
如何保存队列被禁用的时间和消息?
有人知道我如何进行取证分析吗?
任何想法?
更新暴露伪解决方案:
根据 Remus 的帖子,我尝试使用事件通知来获取队列停止的确切时刻。
然后检查事件日志:
但是由于很难知道事件发生的环境,(此时还有什么正在运行??),取证分析到此结束。幸运的是,我的代理服务实现将消息存储为发货日期、收货日期、处理日期……这有助于我检测到在 3 秒内队列中充斥着数百条需要很长时间才能处理的消息.
虽然我找到了一个真正的解决方案,但唯一的临时解决方案是每 x 分钟检查一次代理作业并启用它:
谢谢莱姆斯!
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。
你对如何解决这个问题有什么建议吗?
sql-server - 我在哪里可以找到 ssbdiagnose
有没有一个地方可以让我获得这个实用程序来诊断 sql server 中的服务代理。
sql-server-2008 - Service Broker 外部激活器...在 2 个队列上激活?
我有 2 个队列和更多队列...我想使用外部激活器从外部激活这些队列。
当我编辑 EAService.config 以激活 queue#1 时,它工作得很好。
当我编辑 EAService.config 以激活 queue#2 时,它工作得很好。
如果我将两者都放在配置中,则只有第一个列出的那个会被激活。
两个队列实际上都由同一个 exe 处理......而不起作用的例子是......
另外我不明白 id="100" 在做什么...我尝试使用相同的 # 和不同的 #... 即 100 和 101 但它没有任何区别。激活器服务仅适用于“ApplicationServiceList”中列出的第一个
帮助!
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 变量替换技术的一部分,除非您事先知道它。
sql - SQL Service Broker 通知外部应用程序
在对 Service Broker 进行大量搜索之后,我遇到了这个问题和答案:
我的场景与那里提到的类似,因为我在表上有一个 SQL 触发器,在这个触发器中我调用 xp_cmdshell 将主键信息传递给外部 exe。
我可以看到设置 Service Broker 队列和服务而不是在表上使用触发器的价值。据我了解,我为处理队列中的消息而设置的激活存储过程现在将包含我对 xp_cmdshell 的调用。
但是,我不知道如何将“更改表中的数据”事件作为触发事件。我希望该CREATE EVENT NOTIFICATION
条款对它有ON TABLE [x] FOR [INSERT|UPDATE]
一部分,但它没有。
任何指针将不胜感激。
sql-server - 在嵌套事务中发送和接收 SQL Server Service Broker 消息
我想使用 SQL Server 2008 Service Broker 记录由存储过程动态创建的长时间运行(最多约 30 分钟)事务的进度。我有两个目标:
1) 获取组成事务的动态创建语句的实时日志记录,以便可以远程监控事务的进度,
2) 能够审查组成事务的步骤,直至可能发生故障需要回滚。
我不能简单地将 PRINT(或 RAISERROR(msg,0,0))打印到控制台,因为我想将进度消息记录到表中(并且即使存储过程回滚也保留该日志)。
但我的理解是,在发送线程提交(外部事务)之前,无法从队列中接收消息。这是真的?如果是这样,我有什么选择?
client-server - 无需轮询的客户端之间的消息传递
我有一个 MS SQL 服务器网络,它们通过连接到它们的 (C++/C#) 客户端相互连接。我正在设计一种客户端和服务器-客户端消息传递之间的消息传递方式。我已经阅读过有关 MS SQL 服务代理和其他代理(如 Apache Qpid)的信息。但我仍然不知道这是如何工作的,如果有人可以为我提供更好的资源,或者如果有人已经解决了这样的问题,我将不胜感激。
我怎么可能在客户端之间发送和接收消息?
请确保这不是学校作业或大学课程项目。
我真的很感激任何有用的评论或建议......
+++谢谢+++
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) on 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。
如何创建路由/端点的一些示例:
当我们删除数据库镜像端点时,一切又开始正常工作。
有任何想法吗?
谢谢!
visual-studio-2010 - 如何在 VS2010 数据库项目中包含 Service Broker
我正在尝试将我的 Service Broker 队列添加到我的数据库项目中,但我并不完全清楚什么是最好的方法。我可以使用两个视图,解决方案资源管理器和架构视图。似乎获取 Service Broker 队列及其所有相关消息/服务/合同的唯一方法是在解决方案资源管理器视图中添加队列,然后在架构视图中添加其他所有内容。
它是否正确?这一切难道没有统一的看法吗?在数据库项目中包含 Service Broker 的最佳实践是什么?