Nginx集群之WCF分布式消息队列
目录
1 大概思路... 1
2 Nginx集群之WCF分布式消息队列... 1
3 MSMQ消息队列... 2
4 编写WCF服务、客户端程序... 2
5 服务器安装MSMQ.. 5
6 部署WCF服务程序到局域网内1台PC机... 6
7 Nginx集群配置搭建... 7
8 运行结果... 8
9 总结... 11
1 大概思路
l Nginx集群之WCF分布式消息队列
l MSMQ消息队列
l 编写WCF服务、客户端程序
l 服务器安装MSMQ
l 部署WCF服务程序到局域网内1台PC机
l Nginx集群配置搭建
l 运行结果
l 总结
2 Nginx集群之WCF分布式消息队列
针对WCF分布式消息队列MSMQ大大提高了处理能力,无论是发送方还是接收方都不用等待对方返回成功消息,但是不适合Client与Server端的实时交互。WCF分布式消息队列,在处理日志方面,效果还是很显著的。
当然,针对消息队列的处理技术,有很多种,例如:ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。本文使用的是微软自带的消息队列MSMQ,结合WCF在Ningx集群的环境下,创建一个类似日志型或邮件型的WCF服务。
以下是WCF分布式消息队列的架构:
3 MSMQ消息队列
消息队列MSMQ提供更高程序的非连接通信支持,因为它支持离线通信方式。消息的发送者在离线方式下进行,离线通信方式让进行消息交换的参与者变成完全独立的两个应用,它们之间唯一的纽带就是消息队列。
如果借助MSMQ提供的通信方式,无论出现多高的负载,只要抵达的消息累积量不超过设定的限额,MSMQ就完全可以按照自己的节奏来进行处理。将高负载的请求延后到低负载的时候进行处理,很好地解决了负载上面的问题。
MSMQ中主要有两个概念。
一个是消息Message:Message是通信双方需要传递的消息,它可以是文本、图片、视频等。消息包含发送和接收者的标识,只有指定的用户才能取得消息。
队列 |
描述 |
公共队列 |
在整个消息队列网络中复制,有可能由网络连接的所有站点访问 |
专用队列 |
不在整个网络中发布,它们仅在所驻留的本地计算机上可用,专用队列只能由知道队列的完整路径名称或标签的应用程序访问 |
日志队列 |
包含确认在给定“消息队列中发送的消息回执消息” |
响应队列 |
包含目标应用程序接收到消息时返回给发送应用程序的响应消息,包括机器日志队列、机器死信队列和机器事务死信队列 |
4 编写WCF服务、客户端程序
l WCF服务程序
Program.cs
using Service;
using System;
using System.ServiceModel; namespace MessageDealingHosting
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(PublicMessageQueue)))
{
host.Opened += delegate
{
Console.WriteLine(host.Description.Endpoints[].Address.Uri + "已经启动,按任意键终止服务!");
}; host.Open();
Console.Read();
}
}
}
}
PublicMessageQueue.cs
using System;
using Service.Interface; namespace Service
{
public partial class PublicMessageQueue : IPublicMessageQueue
{
public void SendMessage(string msg)
{
Console.WriteLine(string.Format("消息队列开始处理,输入{0}成功", msg));
}
}
}
IPublicMessageQueue.cs
using System;
using Service.Interface; namespace Service
{
public partial class PublicMessageQueue : IPublicMessageQueue
{
public void SendMessage(string msg)
{
Console.WriteLine(string.Format("消息队列开始处理,输入{0}成功", msg));
}
}
}
服务端配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MessageQueueBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netMsmqBinding>
<binding name="MessageQueueBinding" exactlyOnce="false">
<security mode="None"></security>
</binding>
</netMsmqBinding>
</bindings>
<services>
<service behaviorConfiguration="MessageQueueBehavior" name="Service.PublicMessageQueue">
<endpoint address="net.msmq://10.92.202.56/private/wcf_message" binding="netMsmqBinding" bindingConfiguration="MessageQueueBinding"
contract="Service.Interface.IPublicMessageQueue" />
<host>
<baseAddresses>
<add baseAddress="http:// 10.92.202.56:5600/wcf_message" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
l 客户端程序
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MessageDealingClient.MessageDealingService;
using System.ServiceModel; namespace MessageDealingClient
{
class Program
{
static void Main(string[] args)
{
using (ChannelFactory<IPublicMessageQueue> channelFactory = new ChannelFactory<IPublicMessageQueue>("NetMsmqBinding_IPublicMessageQueue"))
{
IPublicMessageQueue proxyServer = channelFactory.CreateChannel();
proxyServer.SendMessage("hello world");
Console.WriteLine("客户端先启动,将消息传到消息队列,若WCF服务启动,则会输出hello world");
}
Console.Read();
}
}
}
客户端配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<netMsmqBinding>
<binding name="NetMsmqBinding_IPublicMessageQueue" exactlyOnce="false">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
<client>
<endpoint address="net.msmq://10.92.202.56/private/wcf_message"
binding="netMsmqBinding" bindingConfiguration="NetMsmqBinding_IPublicMessageQueue"
contract="MessageDealingService.IPublicMessageQueue" name="NetMsmqBinding_IPublicMessageQueue" />
</client>
</system.serviceModel>
</configuration>
5 服务器安装MSMQ
l 打开“控制面板”
l 单击“程序”,然后在“程序和功能”下单击“打开或关闭 Windows 功能
l 展开“Microsoft Message Queue (MSMQ) 服务器”,展开“Microsoft Message Queue (MSMQ) 服务器核心”,然后选中对应于以下要安装的“消息队列”功能的复选框
n MSMQ Active Directory 域服务集成(用于加入域的计算机)。
n MSMQ HTTP 支持。
6 部署WCF服务程序到局域网内1台PC机
远程部署WCF服务端程序到PC机
7 Nginx集群配置搭建
通过自主义域名zhyongfeng.com:80端口进行负载均衡集群访问,则访问C:\Windows\System32\drivers\etc\hosts,添加下列“本机IP 自定义的域名”:
10.93.85.66 zhyongfeng.com
使用Nginx匹配原则针对WCF部署的1台PC机配置如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; upstream zhyongfeng.com {
server 10.92.202.56:5600;
server 10.92.202.57:5700;
server 10.92.202.58:5800;
}
server {
listen 80;
server_name zhyongfeng.com;
location / {
proxy_pass http://zhyongfeng.com;
proxy_connect_timeout 10s;
}
location /wcf_message{
proxy_pass http://10.92.202.56:5600/wcf_message;
proxy_connect_timeout 10s;
}
}
}
运行CMD:
D:\DTLDownLoads\nginx-1.10.2>start nginx D:\DTLDownLoads\nginx-1.10.2>nginx -s reload
访问WCF服务端:http://zhyongfeng.com/wcf_message,运行结果:
8 运行结果
启动远程WCF服务端,同时启动WCF客户端,结果如下:
关闭远程WCF服务端,启动WCF客户端,结果如下:
再启动WCF服务端,结果如下:
9 总结
基于WCF分布式消息队列,可以在一些客户端并不需要服务端响应的场景上应用。消息队列在异步处理上有巨大优势,是一项可选择性的进程间的通信,能够保持进程之间通信的稳定性。
源代码下载:
http://download.csdn.net/download/ruby_matlab/10134565
PDF下载:
Nginx集群之WCF分布式消息队列的更多相关文章
- Nginx集群之WCF分布式局域网应用
目录 1 大概思路... 1 2 Nginx集群WCF分布式局域网结构图... 1 3 关于WCF的BasicHttpBinding. 1 4 编写WC ...
- Nginx集群之WCF分布式身份验证(支持Soap)
目录 1 大概思路... 1 2 Nginx集群之WCF分布式身份验证... 1 3 BasicHttpBinding.ws2007HttpBinding. 2 4 ...
- Nginx集群之WCF大文件上传及下载(支持6G传输)
目录 1 大概思路... 1 2 Nginx集群之WCF大文件上传及下载... 1 3 BasicHttpBinding相关配置解析... 2 4 编写 ...
- JAVAEE——宜立方商城08:Zookeeper+SolrCloud集群搭建、搜索功能切换到集群版、Activemq消息队列搭建与使用
1. 学习计划 1.solr集群搭建 2.使用solrj管理solr集群 3.把搜索功能切换到集群版 4.添加商品同步索引库. a) Activemq b) 发送消息 c) 接收消息 2. 什么是So ...
- 扎实基础之从零开始-Nginx集群分布式.NET应用
1 扎实基础之快速学习Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少 ...
- 分布式消息队列XXL-MQ
<分布式消息队列XXL-MQ> 一.简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持串行.并行和广播等多种消息模型.现已开放源代码,开箱即用. 支持三种消息模式: ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
- Netty构建分布式消息队列实现原理浅析
在本人的上一篇博客文章:Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇 中,重点向大家介绍了AvatarMQ主要构成模块以及目前存在的优缺点.最后以一个生产者.消费者传递消息的例子, ...
- C#分布式消息队列 EQueue 2.0 发布啦
前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地 ...
随机推荐
- oracle恢复已删除的表
drop 误删除表之后使用flashback table tablename to before drop 可恢复或者使用flashback table "BIN$gcfME7ObTx+n0 ...
- 小白的Python之路 day1 用户输入
1 2 3 4 5 6 7 8 #!/usr/bin/env python #_*_coding:utf-8_*_ username =input("username:") p ...
- 一道看似dp实则暴力的题 Zombie's Treasure Chest
Zombie's Treasure Chest 本题题意:有一个给定容量的大箱子,此箱子只能装蓝宝石和绿宝石,假设蓝绿宝石的数量无限,给定蓝绿宝石的大小和价值,要求是获得最大的价值 题解:本题看似是 ...
- tomcat线程初探
博主:handsomecui,希望路过的各位大佬留下你们宝贵的意见,在这里祝大家冬至快乐. 缘由: 初探缘由,在业务层想要通过(当前线程的栈)来获取到控制层的类名,然后打日志,可是发现并不能通过当前线 ...
- 最全面的JS表单验证
两个日期比較 /* 用途:检查開始日期是否小于等于结束日期 输入: s:字符串 開始日期 格式:2001-5-4 e:字符串 结束日期 格式:2002-5-4 返回: 假设通过開始日期小于等于结 ...
- Windows Azure系列-- 配置Azure Power Shell
1.下载Azure Power shell https://azure.microsoft.com/en-us/documentation/articles/powershell-install-co ...
- Oracle中用户(User)和模式(Schema)的概念
数据库理论中数据库用户和数据库模式并没有必定的联系.具体的数据库模式解释能够在这里找到: http://stackoverflow.com/questions/2674222/what-is-purp ...
- 《跟我学IDEA》四、配置模板(提高代码编写效率)
上一篇博文,我们学习了idea的一些实用配置,相信大家也对idea这个开发工具有了一个大概的了解.今天我们来学习模板的配置,idea提供很多模板从而提高编写代码的效率,比如说一些经常用的代码及生成文件 ...
- SSM学习(二)mybatis和spring的集成
上一篇文章大概搭建了一下ssm的框架,其实还是不完整,我们往项目中添加了spring和mybatis的配置文件,还差一个spring mvc的配置文件,在resource中在新建一个Applicati ...
- 自学Zabbix3.8.3-可视化Visualisation-Screens
自学Zabbix3.8.3-可视化Visualisation-Screens 在Zabbix屏幕上,您可以将来自不同来源的信息分组,以快速浏览单个屏幕.构建屏幕非常简单直观.本质上,屏幕是一个表.您可 ...