前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2019-2-12-wcf入门(14)

2019-2-12-wcf入门(14)

作者头像
黄腾霄
发布2020-06-10 11:46:57
4320
发布2020-06-10 11:46:57
举报
文章被收录于专栏:黄腾霄的博客

本文demo已上传至github:xinyuehtx/WCFdemo

在之前的2019-1-27-wcf入门(6) - huangtengxiao博客介绍了wcf的会话,这一篇介绍可靠会话


可靠消息传输

在了解可靠会话之前我们需要先了解下什么是可靠消息传输(Reliable Messaging)。

我们知道网络数据在传输过程中,丢包,乱序都是一种很常见的情况。

对于某些软件,数据的完整性和有序性是有要求的。

这个时候为了保证应用层面的稳定和有序,就需要一些设置确保消息能够确保端对端的传递。

可靠消息的目标

  1. 确保从源到目标的消息传递。
  2. 当源或者目标有一端出现故障时,可以进行独立恢复。

对这两点做一个简单的说明:

  1. 对于协议的第一个目标。比如消息传送过程中丢包了,可以通过一些方式(如服务端通知客户端重发),确保这个消息还能完整的传送到目标节点
  2. 对于协议的第二个目标。比如客户端发送消息时,服务端正好不可用(比如重启),那么可以通过一些方式(比如缓存消息,至服务可用时再发送),确保服务端可用时能够收到消息

可靠消息的实现

可靠消息的在wcf的实现方式有两种:队列和可靠会话

队列提供了消息发送和接收的缓冲区,将消息的源和目标进行分离。那么如果有一端不可用,消息也不会丢失。

这个方式的优点在于可以实现一些离线模式的应用,但是缺点也很明显,就是消息的高延时

可靠对话有些类似于tcp的可靠数据包,无论中继节点的数目和类型如何,确保消息在端到端的可靠传输。并且能够屏蔽SOAP层面的失败(丢包,消息重复,乱序等),并在传输失败时重新建立连接

这个方法的最大优点在于低延迟

可靠会话演示

可靠会话可以实现屏蔽SOAP层面的失败,并在传输失败时重新建立连接。

这里简单演示可靠会话确保在不稳定信道上的作用。

不稳定信道

首先是创建不稳定信道,这里参考了使命必达: 深入剖析WCF的可靠会话[实例篇](内含美女图片,定力差者慎入) - Artech - 博客园大大给出的示例,通过创建IDuplexSessionChannel的代理,对发送消息进行随机丢弃。再通过自定义绑定元素,注入这个不稳定信道的工厂。详细内容可以在xinyuehtx/WCFdemo中查看示例源码

1550022941150
1550022941150

MessageInspector通过配置的DropRate进行随机丢包

1550023164544
1550023164544

接着我们创建一个IDuplexSeesionChannnel的代理,在Send方法中对消息进行随机丢弃

1550023956656
1550023956656

有了通道还需要通道工厂,创建ChannelFactoryBase<IDuplexSessionChannel>的子类,重写OnCreateChannel返回我们之前定义的不稳定通道

1550024151755
1550024151755

利用通道工厂需要再创建一个BindingElement子类,重写BuildChannelFactory,返回自定义通道工厂

服务实现

服务示例同2019-1-27-wcf入门(6) - huangtengxiao类似

1550024512455
1550024512455
1550024530248
1550024530248
1550025750493
1550025750493

创建服务和客户端进程

1550025474607
1550025474607

在服务端我们创建一个CustomBindingUnreliableElementTcpTransportBindingElement传入

1550025781351
1550025781351

客户端也类似,额外的我们这里连续发送20条消息

1550025445200
1550025445200

结果可见其中许多消息出现了丢失。

1550025364375
1550025364375

使用可靠会话

现在我们修改示例,在binding中添加一个ReliableSessionBindingElement,并且设置Order为false

1550025969517
1550025969517

我们看到20条消息都发送成功,但是其中部分消息的顺序是错误的

1550025926344
1550025926344

现在我们再将Order设置为true

消息完全保留,且没有顺序错误

1550026118483
1550026118483

小结

我们研究了可靠会话,其特点有

  • 可以确保消息完整性,有序性等
  • 对于不稳定的信道通信很有作用

参考链接:


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/wcf%E5%85%A5%E9%97%A8-14.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 可靠消息传输
    • 可靠消息的目标
      • 可靠消息的实现
      • 可靠会话演示
        • 不稳定信道
          • 服务实现
            • 创建服务和客户端进程
              • 使用可靠会话
                • 小结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档