消息队列实现数据同步

应用场景&优势:
  • 异步传输、效率高
  • Redis解决高并发问题
  • 不受限于网络连接(网络中断)
  • 进程死锁(服务器放弃队列中的过期死操作)
  • 数据同步
与SyncFramework比较:
  • SyncFramework 是微软框架,支持离线文件式数据库SqlCE与SqlServer/Oracle的数据同步,要求表结构完全一致,是数据级别同步,与业务无关。只能单线程同步,同步分组只有在数据同步后才知晓有无数据同步、有多少上行/下行同步数据,有不可控因素,实时效率不高,开发代码少。
  • MSMQ消息队列,需要入队出队的任一方安装MSMQ,数据传递稳定、时效性高,业务逻辑需要手写代码处理(消息队列的创建、发送、接收)、数据库不限,灵活性高。
  • 不过MSMQ 判断队列是否存在的等方法都是不支持远程机器的
工作中使用场景:
移动药车APP,网络环境不稳定,需要偶尔的离线时正常使用,所以,存在离线数据库和服务器数据库,这样就需要在网络好的情况下进行数据同步。要求时效性高、传输稳定、有日志追踪。
专用队列:
消息队列:是在消息传输过程中保存消息的容器。
MSMQ是Microsoft的消息处理技术,运行平台为Microsoft Windows操作系统。
它分为用户队列和系统队列。
在用户队列中又分为专用队列:不在整个网络中发布,仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的用户程序访问。
架构方案(图):
消息队列实现数据同步_第1张图片
程序Demo:
分为客户端1和客户端2两部分,客户端1发送消息给客户端2,客户端2接收本地消息队列并显示出来。
发送:
System.Messaging.MessageQueue queue=new System.Messaging.MessageQueue("FormatName:Direct=OS:Client01-PC\\private$\\queue");
//System.Messaging.MessageQueue queue=new System.Messaging.MessageQueue(".\\Private$\\queue");
// Create message
System.Messaging.Message message=new System.Messaging.Message();
message.Body=textBox1.Text.Trim();
message.Formatter=new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
// Put message into queue
queue.Send(message);
接收:
// Receive message, 同步的Receive方法阻塞当前执行线程,直到一个message可以得到
System.Messaging.Message message = queue.Receive();
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
textBox2.Text += message.Body.ToString();
或者
queue.ReceiveCompleted += new ReceiveCompletedEventHandler(messageQueue_ReceiveCompleted);
queue.BeginReceive();
this.button2.Enabled = false;
delegate void SetTextCallback(string text);
private void SetText(string text)
{
  if (this.textBox2.InvokeRequired)
  {
   while (!this.textBox2.IsHandleCreated)
     {//解决窗体关闭时出现“访问已释放句柄“的异常
      if (this.textBox2.Disposing || this.textBox2.IsDisposed)  return;
      SetTextCallback d = new SetTextCallback(SetText);
      this.textBox2.Invoke(d, new object[] { text });
     }}
else this.textBox2.Text += text;
}
private void messageQueue_ReceiveCompleted (object sender, ReceiveCompletedEventArgs e)
{
try
{
  MessageQueue mq=sender as MessageQueue;
  if(null!=mq)
  {
    System.Messaging.Message message = mq.EndReceive(e.AsyncResult);
    message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
    var appendString= message.Body.ToString();
    this.SetText(appendString);
    mq.BeginReceive();
   }
}
catch(Exception ex){}
}  

注意:发送和接收时,都需要队列给足权限,队列最好存在与否先判断。
推荐资料:
http://www.lanhusoft.com/Article/17.html
http://www.cnblogs.com/yjmyzz/archive/2007/12/04/982440.html
http://www.cnblogs.com/mq0036/p/3560783.html
Demo下载地址:




你可能感兴趣的:(C#开发)