我们已经为我们的应用程序实现了SSB消息传递解决方案,但现在正在进入扩展问题。任何具有SSB应用程序扩展经验的人都可以提供关于我们可能会做错什么的建议?最大限度地提高SQL Server Service Broker吞吐量
设置是我们使用单个启动器队列,该启动器队列为激活的过程提供单个目标队列。激活的过程处理收到的消息,并选择性地将它们分派给已注册相关类型消息的客户端。
该第二阶段调度再次使用单个intitiator队列(不同于用于初始消息注入的队列)并将消息发送到任意数量的客户端队列被确定为合适的。
每个客户端都会针对创建发送给所有其他客户端的消息的数据库执行操作,所以这是N^2缩放问题。对于相对较少数量的客户(10或更少),这对我们来说并不成问题,但是当我们扩大到N = 35或N = 40的范围时,我们开始比我们可以更快地排队消息指向工作流程,我们开始承受严重的延迟问题。尽管如此,我们失败的负载仍然低于所报道的SSB实现的最佳性能,所以我相信我们的实施存在缺陷。
相关的诊断包括:
- 我们的服务器有足够的CPU,I/O,而即使在我们已经看到,即使消息在队列中备份的最重的客户端装载可用的网络带宽。
- 我们已将系统配置为从激活的过程的5个副本到512个副本的任意位置激活,对吞吐量和最终用户性能的影响很小。
- 激活的过程一次对多个消息进行操作,并使用一些轻微的XML查询和SELECTS对一些小型数据库表进行处理。我们已经在空载条件下测试了这个程序,其开销很小。
- 我们显示LCK_M_X,PAGELATCH_SH,PAGELATCH_EX和WRITELOG等待的比例很高(这是前4名犯人)。
- 在我们最重的负载下,我们显示的发送次数/秒数大约是接收次数/秒。
如果还有其他的诊断方法对任何可能对我们可以做什么来加快配置速度的人有所帮助的诊断信息,我可以找到它们。
你如何管理对话?你是否重新循环对话ID或每条消息创建一个? – Rikalous 2013-05-10 20:52:16
我们正在回收对话ID - 我们为每个连接到服务器的客户端打开一个对话,并通过专用对话向该客户端发送所有消息。 – mwigdahl 2013-05-10 21:49:56