12-EasyNetQ之消息版本控制
为了能够支持消息版本控制,你需要确保这个必要的组件已配置。最简单的实现是这样的:
var bus = RabbitHutch.CreateBus("host=localhost",
services => services.EnableMessageVersioning());
一旦消息版本功能启动,你必须显示的选择你要版本化的消息加入版本控制。
// 这个消息不是被版本化的, 当这个消息被发布时,将和其他消息用同样发布去处理。
public class MyMessage
{
public string Text { get; set; }
}
// 这个消息是版本化过的。对于订阅者有两种消息,MyMessageV2和MyMessage
public class MyMessageV2 : MyMessage, ISupersede<MyMessage>
{
public int Number { get; set; }
}
它是怎么工作的?
当你发布一个消息,EasyNetQ通常为这个消息类型创建一个交换机,然后发布这个消息到这个交换机。订阅者创建队列,绑定到这个交换机,因此可以接收任何发布到这个交换机上的消息。
当版本化的消息启用时,EasyNetQ将为每一个继承结构的版本化消息类型创建一个交换机,然后绑定这些交换机在一起。当你发布MyMessageV2消息时,这个消息被发送到MyMessageV2交换机上,并自动向上转发到MyMessage交换机。
当消息被序列化时,EasyNetQ会存储这个消息类型名称到这个消息的Type属性中。这个元数据会连同消息一起发送到任何订阅者,订阅者然后能够用这个元数据来反序列化这个消息。
当版本化消息启用时,EasyNetQ也将存储所有被取代的消息类型到这个消息Header属性中。订阅者将用这个属性查找第一个可用的消息类型去序列化,就算终结点没有最新版本的消息,只要有一个版本,它就能够被反序列化和被处理。
消息版本化指南
- 如果不能通过扩展原始消息类型去实现,那么它就不是一个新版本的消息。它是一个新的消息类型。
- 如果你不确定,宁可去创建一个新的消息类型,而不是去版本化一个已存在的肖。
- 被版本化的消息,不应该在Request/Response中做为消息类型去使用,Request<V1,Response>和Request<V2,Response>是不同的,即使V2扩展与V1也是不同的。
- 版本化的消息不应用于Send/Receive,因为这是有针对性的发送,因为发送者和接受者之间是有依赖的。
反之
- 版本化消息支持已经在发布-订阅场景中被开发和测试过。它没有在send-receive 或者 request-response场景中被测试过。在发布-订阅之外其他模式中,风险自负。
- 版本化消息支持这个时候还没有扩展到未来的publish场景下。额外的工作已经计划开启了,但是由于潜在的中断可能发生,项目所有者和社区需要一些必要的讨论。
英文版本:https://github.com/EasyNetQ/EasyNetQ/wiki/Versioning-Messages
本文地址:http://www.cnblogs.com/HuangLiang/p/EasyNetQ_Versioning_Messages.html
12-EasyNetQ之消息版本控制的更多相关文章
- EasyNetQ使用(六)【多态发布和订阅,消息版本控制】
你能够订阅一个接口,然后发布基于这个接口的实现. 让我们看下一个示例.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name ...
- 12.18 webSocket消息推送
---恢复内容开始--- 准备工作: 在要跳转到的页面加入js <#--弹窗--> <div class="modal fade" id="myModa ...
- 使用EasyNetQ组件操作RabbitMQ消息队列服务
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...
- .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- 14,EasyNetQ-使用EasyNetQ.Hosepipe重新提交错误消息
EasyNetQ队列管理实用程序. 用它从队列中抓取消息并重新发布. 还可以用它来检查错误队列消息并重试它们. 1,用法: EasyNetQ.Hosepipe.exe <command> ...
- 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析
对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题.对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP.NET WebAPI,ORM ...
- 9,EasyNetQ-版本化消息
要启用对版本化消息的支持,您需要确保配置所需的组件. 最简单的方法是: var bus = RabbitHutch.CreateBus( "host=localhost", ser ...
- EasyNetQ介绍
EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...
- [iOS微博项目 - 3.6] - 获取未读消息
github: https://github.com/hellovoidworld/HVWWeibo A.获取登陆用户未读消息 1.需求 获取所有未读消息,包括新微博.私信.@.转发.关注等 把未 ...
随机推荐
- 【python】imp模块的使用
是import在程序中的使用 [一]函数load_source imp.load_source(moduleName, sourceFile) 使用: abc = imp.load_source('d ...
- 2017年--10年java大神告诉你开发最常用的百分之二十的技术有哪些?
首先题主说的20%我不知道从哪方面去理解.接下来我会将自己多年来工作中会经常使用到的技术列出来. 1.html.css 2.java工作原理(jvm) 3.java语法.数据结构和算法 4.java语 ...
- Cisco DHCP 配置要点
实验拓扑图:IOU5/6/7模拟主机 IOU1为DHCP服务器 IOU2为DHCP中继器 IOU3/4为局域网内的交换机 在IOU1中配置DHCP配置 IOU2作为DHCP中继,在E0/0.10和E0 ...
- [转载] ffmpeg Windows下采集摄像头一帧数据,并保存为bmp图片
这里请注意,在编译ffmpeg时,不要使用--disable-devices选项. 使用 --enable-encoder=rawvideo --enable-decoder=rawvideo 启用r ...
- 21天学通C++_Day2
继续学习,今天满课,相对学习内容较少,下面罗列内容: 0.常量 ▪字面常量: ▪使用关键字const声明的常量,const double Pi = 22.0/7; //后面有分号,跟定义变量一样 ▪使 ...
- vc++ windows 快速启动栏创建快捷方式
创建快速启动栏 在windows软件开发中,软件安装过程中总是需要在快速启动栏创建快捷方式,下面介绍一种快速启动栏创建快捷方式的方法,具体代码如下:(该方法不支持win10,目前还没有找到win10的 ...
- 使用JspSmart文件上传
index.html [html] view plaincopy <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transition ...
- MongoDB:MapReduce基础及实例
背景 MapReduce是个非常灵活和强大的数据聚合工具.它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理. MongoDB也提供了MapReduce,当然查询语肯定是Java ...
- #51单片机#蓝牙模块(ATK-SPP-HC06从机串口)的使用方法
#include <AT89X51.H> #include <intrins.h> // 函数原形定义 #define uchar unsigned char #define ...
- Angular2使用boostrap和ng-bootstrap总结
Angular2使用bootstrap有几种方式,本文主要介绍两种方式进行Boostrap样式的使用: 一.直接通过静态文件的方式进行引入: 通过命令新建一个Bootstrap的工程 ng new B ...