280 likes | 395 Views
ARC314 消息传递 - 面向消息的中间件设计基础. 微软的中间件. 回归自然 – MSMQ Microsoft Message Queue. 日程. 应用集成技术的发展与回顾 消息传递基础 面向消息的集成中间件设计实践 展望 Indigo 与未来的集成. 应用集成技术的发展与回顾. RPC 与应用集成. 应用集成中间件设计的目标. 应用程序之间需要互相 “ 交谈 ” 不违反 “ Once and Only Once ” 规则 在计算的过程中需要集中处理以确保正确性 在计算的过程中需要分布处理以确保可缩放性 总之机器与机器需要进行 “ 交谈 ”
E N D
微软的中间件 回归自然 – MSMQ Microsoft Message Queue
日程 • 应用集成技术的发展与回顾 • 消息传递基础 • 面向消息的集成中间件设计实践 • 展望Indigo与未来的集成
应用集成技术的发展与回顾 RPC与应用集成
应用集成中间件设计的目标 • 应用程序之间需要互相“交谈” • 不违反“Once and Only Once”规则 • 在计算的过程中需要集中处理以确保正确性 • 在计算的过程中需要分布处理以确保可缩放性 • 总之机器与机器需要进行“交谈” • 传统建议我们使用RPC来解决这一问题 • “让远程通信和本地调用一样容易" • 定义一个接口 • 编写服务器端实现 • 工具生成两者之间需要的通信管道
RPC 编程模型 接口 public long add(long l1,long l2); 实现 编译器 客户端 public long add(long l1, long l2) { return l1+l2; } long I = add(5,10); 请求消息 Method: add Params: 5(long),10(long) method method stub skeleton Return: 15(long) 响应消息
RPC存在的问题 • RPC方法忽略了: • 延迟 (网络、应用程序) • 部分失败和并发 • … “Objects that interact in a distributed system need to be dealt with in ways that are intrinsically different from objects that interact in a single address space.” Waldo et al, 1994 “95% transparent is not good enough. In fact, it is worse because it deceives developers.” Werner Vogels
RPC存在的问题 • RPC让通信更容易,但代价是: • 请求/响应通信 • 针对每一个请求,我们期望一个响应 • 阻塞调用者线程直到接收到响应(或者响应超时) • 代理和Stub强绑定 • 强绑定和类型一致使得编程容易 • 但强绑定和类型一致使得变化非常困难 • RPC暴露行为
解决方案: 消息传递 • 系统间通过管道通信 • 管道有逻辑地址 • 发送应用程序将消息放到管道中,然后处理其它工作(“fire-and-forget”) • 管道将数据排队直到被接收应用程序使用(FIFO) 系统 A System B Channel (Queue) Message
解决方案: 消息传递 • RPC的本质 • RPC == 请求消息 + 响应消息 • 把消息分开,独立处理 • 允许不同的消息交换模式 • 消息传递暴露数据 • 替代基于接口来创建约束 (RPC)… • 基于消息类型来创建约定 (messaging) • 上下文完整的通信 A B Send Rcv Rcv Send 是RPC还是2条消息?
面向消息的中间件Message-Oriented Middleware (MOM) • 消息 = 消息头 (路由信息) + 消息正文 • 支持异步发送 • 不指定格式(松散约束) • 目的地 = 命名的消息存储仓库 • 解耦合消息的产生者与消费者 • 便于重定向或者改变调用流程 • 运行环境 = 多样化的发送方式 • 服务质量: Reliable, transacted, prioritized, deadline-based • 通信方式: publish-and-subscribe等. • 消息交换模式 • Request-response, fire-and-forget, request-async response
消息传递架构模式 • 消息传递是一种架构模式,而不是一种技术 • 我们可以使用一个数据库来实现消息传递,但使用数据库不地表我们使用的是消息传递 • 与SOA/Web Services的争论对比: • 我们可以不使用Web Services来构建SOA • 使用Web Services并不能保证是SOA • 架构模式由一组词汇、结构和设计约束组成
消息传递系统举例 • 文件传输 • 消息: 文件 • 目的地: 文件系统目录 • 运行环境: 操作系统的文件系统 • 数据库 • 消息: 数据集 • 目的地: 数据库表 • 运行环境: 数据库 • JMS/MSMQ • 消息: byte, text, object, stream … • 目的地: 队列 (point-to-point), 主题 (publish-subscribe) • 运行环境: MOM环境支持 • SOAP • 消息: SOAP XML format • 目的地: (取决于传送方式) • 运行环境: WebLogic, WS-Reliable Messaging
为什么要使用消息传递 • 灵活性 • 可缩放性 • 高负载的平缓释放 • 集成性
为什么要使用消息传递?灵活性 • 更多的数据流选择 • Fire-and-forget, multicast, disconnected, load-balancing, flow control, priority routing等. • 多粒度的处理逻辑 • Routing Slip • Content-Based Router • 更容易维护和变化 • 消息格式的变化不需要重新编译不相关的客户端 • 消息流的传递不需要修改中间结点 • 避免并发死锁 (和RPC响应阻塞相比)
为什么要使用消息传递?可缩放性 • 竞争消费 – 多个处理端可以读取同一队列 • 发送端不需要进行任何改变 • 粗粒度消息可以使处理端成为“无状态” 1 消费者 接收者 3 2 1 2 消费者 发送端 消息 接收者 3 竞争消费模式 消费者
为什么要使用消息传递?高负载的平缓释放 • 队列中存储的消息将会等待被处理 • 消息处理端或消费者会经可能快的取走消息 • 如果处理端阶段无法继续: • 我们可以增加更多的处理端 • 或者等待峰值负载被释放 Peak Load Rate [Msgs/sec] Steady processing rate Producer Consumer time Queue Length f’(x) constant time
为什么要使用消息传递?集成性 • 消息传递不需要一致的类型系统 • 消息就是类型 • 消息传递可以连接多个系统(.NET,J2EE,etc.) • XML消息非常适合此类场景 • 其它数据表现形式也可用 (CSV,文本) • 消息传递的灵活性使得集成更容易
消息传递面临的挑战 • 使用队列来通信,而不是对象 • 双向通信需要至少2个队列:一个用于请求消息,另一个用于响应 • 不存在会话状态 • 时序 – 消息的到达可能是无序的 • 同步通信需要进行更多的设计 • 不存在对象标识 • 消息进入队列,而不是对象 • 不符合通常的客户/服务器模式 • 类似“生产者消费者”,甚至于“点对点”通信
小结 • 消息传递提供了另一种通信手段 • 消息传递具有灵活性 • 消息传递具有可缩放性 • 消息传递可以在多个管道上操作 • 消息传递需要程序员考虑的更多 • 在消息交换模式中,有很多不同的交换模式存在
未来的挑战 极大的简化分布式应用程序开发 不同的任务需要不同的编程模型 我们需要安全和可靠的消息传递 应用程序需要与其它平台互操作 我们需要更有效的面向服务的编程模型
.NET Remoting System. Messaging Enterprise Services ASMX WSE 今天的分布式技术
Indigo统一的编程模型 .NET Remoting ASMX Interop with other platforms Extensibility Location transparency Attribute- Based Programming Message- Oriented Programming WS-* Protocol Support Enterprise Services System.Messaging WSE
Basic WS-I 1.0 support Based on the ASP.NET Stack Adapter for WSE 2.0 SQL-to-SQL data messaging Binary protocol Adapter for Indigo Indigo transport channel Service Broker uses Indigo transports for WS-* interoperability BizTalk Server built natively on Indigo foundation 集成技术的未来之路
您的反馈对我们很重要! 非常感谢您参加今天的交流