我需要实现一个简单的工作人员集群,它可以创建包含大量 pdf 的文件 zip 文件。架构,现在看起来像这样:
- 单个客户端(WebAPI + AngularJS)
- 完成这项工作的 Hangfire 服务器集群
一旦客户端请求一个新的 zip 文件,该请求就会在 Hangfire 队列中排队。当集群中的一个节点空闲时,作业将启动。在作业执行期间,客户端将收到有关进度的通知。既然是集群,就需要另外一个组件:
- 一个所谓的SignalR 背板,用于处理工作人员和客户端之间的通信
我使用 Redis 来实现这个组件,感谢一些 NuGet 包(即Microsoft.AspNet.SignalR
,Microsoft.AspNet.SignalR.Redis
)和这个文档,这非常简单,我唯一需要做的就是在 Owin 启动文件中添加一些新行;一个给工人:
public class WorkerStartup
{
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDB");
GlobalHost.DependencyResolver.UseRedis("IP", 6379, String.Empty, "TOPIC");
app.MapSignalR();
app.UseHangfireServer();
}
}
一个用于 WebAPI,它们是平等的,但 Hangfire 配置:
public class ClientStartup
{
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDB");
GlobalHost.DependencyResolver.UseRedis("IP", 6379, String.Empty, "TOPIC");
app.MapSignalR();
app.UseHangfireDashboard(); // The client only needs Hangfire dashboard
}
}
它就像一个魅力,Redis 做得很好。我会尝试使用 Azure 服务总线(基于此处的链接)重新实现所有内容,我将包Microsoft.AspNet.SignalR.Redis
替换Microsoft.AspNet.SignalR.ServiceBus
为以下行UseRedis
:
GlobalHost.DependencyResolver.UseServiceBus("Endpoint=sb://XXX.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XXX", "TOPIC");
但是一旦我开始客户端/服务器通信,我就会得到:
无法成功初始化任何传输。尝试为自动初始化指定不同的传输或根本不指定。”
怎么了,应该没问题。。。