问题标签 [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 回答
2540 浏览

web-services - 服务代理 - 与外部应用程序通信时的多个队列与单个队列

我们目前有一个应用程序,它使用服务代理将消息排队以发送到外部系统,我们通过 Web 服务接口与之通信。

目前我们只与一个公司集成,所以一个队列就足够了——但是我们需要开始将消息传递给使用相同 Web 服务接口的多个公司。

我想知道一个队列系统是否足以满足此要求,或者我们是否应该为每个公司设置一个队列。每家公司都有一个队列,我担心会扩展它,因为我们可能有很多队列,然后有很多连接来检查队列。

但是,对于单个队列,我们​​可以根据需要添加更多阅读器。但是,如果我们无法与外部系统之一进行通信(例如连接问题),那么消息就没有问题,我们想重试它,但我们不想延迟发送给那些系统已启动。我想知道人们目前是如何处理类似情况的?

我们可以重新插入消息,但我担心的是我们不保证交货顺序。

0 投票
1 回答
2040 浏览

service - Service Broker 外部激活多次运行应用程序

我使用服务代理作为我的消息传递系统来安排和运行作业。Eash 作业由称为引擎的多个任务或步骤组成。

我的服务代理对象是:

  • 消息类型:SubmitJob、JobResponse、SubmitTask、TaskResponse
  • 合同:JobContract、TaskContract
  • 队列:ClientQueue、JobQueue、EngineQueue、ExternalActivatorQueue
  • 服务:ClientService、JobService、EngineService、ExternalActivatorService
  • 事件通知:EventNotificationEngineQueue

我在作业队列上有内部激活(存储过程)。对于 SubmitJob 消息类型,存储过程获取该作业的第一个任务,启动与 EngineService 的对话并向该队列 (StartTask) 发送消息然后他们会被提交到 EngineQueue,如果没有,那么这个作业的任务就完成了(发送消息并清理。)

这一切似乎都很好。但是,我想要一个处理 EngineQueue 消息的外部应用程序(引擎)。所以我使用了微软的外部激活机制(ssbeas.exe)。花了很长时间,但我终于让它工作了。一条消息进入 EngineQueue,EventNotificationEngineQueue 启动我的应用程序并排空队列。到目前为止,一切都很好。但是,我的应用程序似乎运行了多次。我的测试应用程序配置为在完成时发送电子邮件。即使我只发送一项任务的作业,我也会收到多封电子邮件(表明程序运行了多次。)

这是我的应用程序(vb.net)的代码(代理是一个封装服务代理服务(发送、接收等)的对象:

我不明白为什么该应用程序会多次运行,但除此之外,我不明白为什么后续版本仍然能够看到队列中的消息。毕竟,第一个化身应该已经将消息锁定在队列中。它确实锁定了队列,因为我能够使用查询管理器进行测试,以尝试在我的应用程序运行并且它被阻止时接收消息。

我尝试过使用 EAService.config 中的并发值。当我将它设置为 min="0" 和 max="1" 时,我确实将应用程序运行的次数减少到了两次以前,使用 min="0" 和 max="10",它正在运行它好像是18份。

我希望这是有道理的,并对长度感到抱歉。有人知道这里发生了什么吗?我的 .net 应用程序编码有误吗?

谢谢马丁

编辑:添加引擎运行后创建的日志:

2010-02-08 09:31:39 - 主要
2010-02-08 09:31:39 - 收到:提交任务
2010-02-08 09:31:39 - ProcessMsg
2010-02-08 09:31:39 - <Task><TaskID> 5</TaskID><TaskKey>2</TaskKey></Task>
2010 -02-08 09:31:39 - DoWork
2010-02-08 09:31:39 - 发送电子邮件
2010-02-08 09:31:40 - 提交...
2010-02-08 09:31:40 -睡眠
2010-02-08 09:32:10 - 睡眠完成。
2010-02-08 09:32:10 - 主要完成
2010-02-08 09:32:10 - 外部激活的应用程序成功并立即终止。
2010-02-08 09:32:10 - 主要
2010-02-08 09:32:10 - 收到:提交任务
2010-02-08 09:32:10 - ProcessMsg
2010-02-08 09:32:10 - <Task><TaskID> 5</TaskID><TaskKey> 2</TaskKey></Task>
2010 -02-08 09:32:10 - DoWork
2010-02-08 09:32:10 - 发送电子邮件
2010-02-08 09:32:10 - 提交...
2010-02-08 09:32:10 - 睡觉
2010-02-08 09:32:40 - 睡觉完成。
2010-02-08 09:32:40 - 主要完成
2010-02-08 09:32:40 - 外部激活的应用程序成功并立即终止。

你可以看到它通过了整个应用程序两次(主要,接收,dowork,sendemail,完成。)

编辑 2:这是在将作业提交到队列时激活的存储过程(调试语句和所有)的最新版本:

0 投票
1 回答
2321 浏览

sql-server - SQL Server Service Broker -- 通过 VPN 在非域服务器之间进行通信

如果这些服务器都不在域中,但我们可以完全控制登录名和凭据,是否有任何好的选择可以通过 Service Broker 连接两个 SQL Server 2008 实例?

我们正在考虑将这种技术用于企业级数据整合,但我们的服务器在客户端站点上运行,并且未配置为任何域的成员。我们正在寻找让 Service Broker 在此环境中进行通信的最轻松的选项。

0 投票
2 回答
95 浏览

sql-server-2005 - 为什么在目标服务是初始化服务时不在引号中?

我刚刚继承了一个使用服务代理的 SQL Server 2005 数据库(这是一个更大的项目/解决方案的一部分)。关于解决方案的一切工作正常。我正在尝试了解服务代理 SQL,我看到了这个语句。

为什么 foo_Init 不在单引号中?我希望它会像“foo_Target”一样。

0 投票
1 回答
420 浏览

sql-server - 读取 Service Broker 队列时获取主机名 (SQL Server 2005)

我正在尝试使用 Service Broker 在我的 SQL Server 上配置审核。我完成了捕获 DDL 事件(队列、路由、端点、事件通知)所需的所有配置。它工作正常,只是我无法从 DDL 事件的来源处获取客户端的主机名。

使用服务代理的激活过程,我尝试从 message_body 读取值,但没有包含主机名的 xml 元素。我可以看到 SPID 的值,但无法使用它。执行 sp_who 并针对此 SPID 查询 sys.processes 不会返回任何值。并且运行不带参数的 sp_who 只显示一个进程(我认为它是服务代理使用的后台进程)。是不是因为消息是异步发送的?但是为什么会导致激活上下文在 sys.processes 视图上看到不同的数据呢?

我知道有 DDL 触发器可以实现相同的目标,但它似乎与导致它触发的命令紧密耦合。因此,如果触发器失败,命令也会失败。

更新:我设法通过使用 xp_cmdshell 和 sqlcmd (命令行应用程序)的组合来检索主机名。但我也意识到,由于消息是异步的,它并不总是可靠的(发出 DDL 命令的 SPID 可能在从队列中读取消息之前已经断开连接)。

0 投票
1 回答
2564 浏览

triggers - 使用 SqlNotificationRequest 的服务代理

我正在为我的项目评估带有 SQL 通知的 Service Broker。我的要求是用户从系统 A 下订单,它将更新订单表。下订单后,我需要立即通知系统 B。我已经使用 Trigger、Service Broker 和 SQLNotificaiton ADO.NET 进行了快速 POC。它按我的预期工作。

我想知道什么 A) 我需要遵循哪些最佳实践?B)如果有的话,上述方法有什么缺点?C) 使用触发器有什么缺点吗?如果是这样,上述方法的那些是什么?

订单表每天会从系统 A 收到订单,比如 1000 到 1500 个。我也想知道上述方法的性能。

0 投票
1 回答
552 浏览

sql-server - SQL Server Service Broker 服务消失(自动删除)?

我已经通过 SQL Server Service Broker 实现了一个消息传递系统。它工作得很好,唯一的例外是每隔一段时间(可能每台服务器每周一次)我的启动器服务就会消失得无影无踪。对应的队列还在,但是服务不见了。

显然,这会导致我的系统出现问题。手动重新创建服务是一件简单的事情,但我对可能导致这种行为的原因感到困惑。我了解自动中毒消息处理会导致队列被禁用,但我没有看到任何表明可以自动禁用或删除服务的内容。

发生这种情况时,我通常会在多个应用程序队列中积压大量消息,但没有什么特别的。总消息积压约为 200,000 条。

有谁知道这里可能会发生什么?

0 投票
2 回答
3023 浏览

sql-server - 帮助 Service Broker 错误消息

每当我尝试在两个不同的 SQL Server 服务器之间发送 SQL Service Broker 消息时,我的 sys.transmission_queue 表中都会出现此错误。(即数据库在两台不同的物理机器上)

当此错误涉及“数据库主体”时,它指的是什么?(“主”数据库?dbo 用户?)我使用了 CREATE CERTIFICATE 命令,备份了证书并使用来自第一台服务器的备份 .cer 文件在另一台服务器上创建了一个相同命名的证书,但我一直得到这个信息。

任何帮助将不胜感激,让我指出正确的方向。我一定遗漏了一些明显的东西。

仅供参考,在我的开发环境中,启动数据库和目标数据库都位于同一物理服务器和同一 SQL 实例上,一切正常。

0 投票
1 回答
3449 浏览

service-broker - 当表超过 500k 行时,如何快速获取 Service Broker 队列的大小?

当队列非常大时,我正在尝试确定 Service Broker 队列和传输队列的总大小。问题是像下面这样的传统查询不起作用,因为它不是表。有任何想法吗?

0 投票
2 回答
602 浏览

sql-server-2008 - SQL Service Broker 2008 中的独白对话

我有一个场景,我需要处理(在 SQL Server 中)作为文件夹中的 .xml 文件实时传递的消息。

我开始调查 SQL Service Broker 以满足我的排队需求。基本上,我希望 Service Broker 提取我的 .xml 文件,并在它们到达文件夹时将它们放入队列中。但是,SQL Service Broker 不支持“独白”对话,至少在当前版本中不支持。它只支持发起者和目标服务之间的对话。

我可以使用 MSMQ,但我需要维护两件事 - MSMQ 中用于文件处理的 .Net 代码和 SQL Server T-SQL 存储过程。我还有什么选择?

谢谢。