有没有办法在Asp.Net MVC 2中使用NServiceBus?我想从Asp.Net MVC2应用程序向服务发送请求消息,该服务处理消息并回复响应消息.有没有办法清楚地做到这一点?
我们已经为一组NServiceBus服务聚集了MSMQ,一切都运行良好,直到它没有.一台服务器上的传出队列开始填满,很快整个系统都挂起了.
更多细节:
我们在服务器N1和N2之间有一个集群MSMQ.其他群集资源只是作为本地(即NServiceBus分发服务器)直接在群集队列上运行的服务.
所有工作进程都位于不同的服务器上,即Services3和Services4.
对于那些不熟悉NServiceBus的人来说,工作会进入由经销商管理的集群工作队列.Service3和Services4上的工作程序应用程序将"我准备工作"消息发送到由同一分发服务器管理的集群控制队列,并且分发服务器通过将一个工作单元发送到工作进程的输入队列来响应.
在某些时候,这个过程可以完全挂起.下面是系统挂起时集群MSMQ实例上的传出队列的图片:

如果我将群集故障转移到另一个节点,就像整个系统在裤子中得到了一些好处.以下是故障转移后不久的同一群集MSMQ实例的图片:

任何人都可以解释这种行为,以及我可以做些什么来避免它,以保持系统平稳运行?
如果我理解正确,我可以使用nServiceBus作为"框架"和/或RabbitMQ的包装器我对RabbitMQ的偏好能够在linux机器上使用它
背景
我有一个应用程序,使人们可以上传图像.这些图像需要缩略图.
我们的应用程序主要是asp.net(c#)
我的想法是做以下事情:
我想我可以使用亚马逊SQS,但我想探讨使用RabbitMQ进行传输的nServiceBus的可能性.
有没有人有这方面的进一步信息?我在GitHub上看到了这个:http://github.com/machine/machine.mta/tree/master/Source/NServiceBus.Unicast.Transport.RabbitMQ但是想知道如何使用它?
你最喜欢的方法是什么?
我有一个在Windows 2003服务器上运行良好的现有应用程序.我一直在将它移动到Windows 2008r2,当应用程序试图访问队列时,它得到以下错误?我的应用程序池的Indentity用户可以完全控制我的消息队列.有没有人对如何解决这个问题有任何想法.我相信这是服务器配置问题.
[MessageQueueException (0x80004005): Access to Message Queuing system is denied.]
System.Messaging.MQCacheableInfo.get_ReadHandle() +221
System.Messaging.MessageEnumerator.get_Handle() +70
System.Messaging.MessageEnumerator.MoveNext(TimeSpan timeout) +93
System.Messaging.MessageQueue.GetAllMessages() +58
NServiceBus.Unicast.Subscriptions.Msmq.MsmqSubscriptionStorage.Init(IList`1 messageTypes) +124
NServiceBus.Unicast.UnicastBus.Start(Action`1[] startupActions) +674
Connector.Service.InitBus() +201
Connector.OutgoingService..cctor() +9
Run Code Online (Sandbox Code Playgroud) 我正在开发一个系统来支持从各种硬件类型接收状态信息.每个硬件都报告相同的状态信息(纬度,经度),但每种硬件类型都使用唯一的协议来报告此信息.出于这个原因,我有多个服务,每个设备类型一个,监听和解析该设备的协议.我希望每个服务都使用一条公共消息发布状态信息:
public interface IPositionMessage : IMessage
{
string UnitName { get; set; }
double Latitude { get; set; }
double Longitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我没有设置我的第一个服务,但现在我正在设置我的第二个服务,我发现我的订阅者无法订阅来自多个发布者的相同消息.
在NServiceBus yahoo组的类似问题中,推荐的解决方案是将公共消息转换为命令并使用Bus.Send而不是Bus.Publish.我觉得在这种情况下没有意义,因为真正发生的事情是一个事件(该单位已经到达一个位置并报告新的位置).如果我要将此转换为命令,我需要提前知道此事件的所有潜在订阅者,我不这样做.另一种可能的解决方案是创建一个聚合/重新发布者,每个服务将Bus.Send,然后该消息将从单个发布者重新发布.这似乎是一个不必要的瓶颈.
是否有任何方法允许订阅者订阅来自多个发布者的相同消息?
3版之前的建议是在分发服务器旁边运行超时管理器作为群集上的独立进程.(详见此处:http://support.nservicebus.com/customer/portal/articles/965131-deploying-nservicebus-in-a-windows-failover-cluster).
在将超时管理器作为附属程序集包含之后,在与分发服务器进行扩展时使用它的正确方法是什么?
服务A的每个工作程序是否应该在启用超时管理器的情况下运行,或者只应将服务A的分发程序进程配置为运行服务A的超时管理器?
如果每个工作者都运行它,他们是否共享相同的Raven实例来存储超时?(如果是这样,你如何确保两个或多个工人同时没有获得相同的过期超时?)
我正在努力解决这个架构问题,我们的系统正在使用NService Bus,并使用NEventStore和NES实现带有EventSourcing的DDD.客户端应用程序是WPF
我仍然无法确定更新UI的最佳做法是什么,例如:我有一个用于创建的UI(Batch {Id,StartDate,EndDate等...}),在用户点击保存后,我正在发送一个命令(CreateBatch),
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc });
Run Code Online (Sandbox Code Playgroud)
现在,
选项1
我可以注册回复如下:
private void btnSave_Click(object sender,EventsArg e){
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc })
.Register<int>(c=> {
MessageBox.Show("Command Succeded");
Close();});
}
Run Code Online (Sandbox Code Playgroud)
在服务器端:
public void Hanlde(CreateBatch cmd){
//initiate aggregate and save it.
Bus.Return( /*What ?? Success Code?*/);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何处理错误?(验证错误,例如已经在同一天开始批量生产?),因为你只能返回int或string !!
选项2:
发送命令,关闭窗口,假设记录已添加到主网格中,直到用户刷新网格并从ReadModel数据库中获取真实数据,或者发现该记录尚未添加但不知道发生了什么!
private void btnSave_Click(object sender,EventsArg e){
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc });
Close();
}
Run Code Online (Sandbox Code Playgroud)
选项#3
发送命令,关闭窗口,假冒记录在主网格中添加但标记为(进行中),等待(BatchCreated)事件到达,检查它是否与我们之前发送的批次ID相同,然后将记录标记为在网格中保留.
private void btnSave_Click(object sender,EventsArg e){
Bus.Send<CreateBatch> …Run Code Online (Sandbox Code Playgroud) 在分布式消息事务世界中,我试图理解开发分布式系统所涉及的不同部分.据我所知,您可以使用支持消息队列系统的企业总线设计消息传递系统.为什么两者都使用是个好主意?通过仅对消息排队系统进行编程可以实现同样的目的吗?将两者结合使用有什么好处?
msmq masstransit nservicebus distributed-transactions rabbitmq
我正在查看一位前同事编写的项目,在文件中launchSettings.json(在“属性”下)他有以下内容:
{
"profiles": {
"ProjectName": {
"commandName": "Executable",
"executablePath": "C:\\code\\project\\\\src\\project.name\\bin\\Debug\\net471\\NServiceBus.Host.exe"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这executablePath是他的本地存储库所在的路径。但当然,其他团队成员不会有相同的本地路径。这很好,而不是我们应该强制执行的。
两个问题:
->“..\net471\NServiceBus.Host.exe”
我最近开始熟悉 DDD 概念和 CQRS,我意识到 CQRS 中最重要的概念之一是除负载平衡、NServiceBus 等之外的 DDD,但我很好奇我们是否可以单独使用 DDD 概念而不在 CQRS 复杂性中使用它开发和创建我们的项目。据我所知,这是一种通过将实现连接到不断发展的模型来满足复杂需求的软件开发方法。我需要知道单独使用 DDD 或与 CQRS 一起使用的项目规模应该是多少。
nservicebus ×10
c# ×5
msmq ×3
cqrs ×2
rabbitmq ×2
.net ×1
amazon-sqs ×1
masstransit ×1
msdtc ×1
nservicebus3 ×1
wpf ×1