【通信系统设计】一些设计方面的模式

一、概述

电信级产品的设计需要考虑的5个方面:
Availability(可用性)
可用性      一年宕机时间
99.99%      52分钟34秒
99.999%     5分钟15秒
99.9999%    32秒

Reliability(可靠性)
对于电信级系统,一般要求99.99%,也就是10000个呼叫中只有1个呼叫丢失

Scalability(可扩展性)
主要体现在,增加新的处理器或服务器时,能够负荷分担,增加系统处理能力

Capacity(能力或容量)
需要提高单个处理器或服务器的处理能力

Productivity(生产率)
电信级系统动辄百万行,甚至上千万行代码,在开发产品需要大量时间,这就需要提高生产率


二、常用模式

一些在开发电信级系统的开发模式:
1. 选择面向对象来开发系统,可以在处理协议和状态机上很好的利用多态性和继承性。
一些如Singleton、Flyweight、Abstract Factory等设计模式是很有用的。
因为运行期在堆上分配内存会导致很多内存碎片,所有可以Object Pool的概念,使得在系统的初始化时就预先分配好内存。
Object Template使用了Block-copy的操作提高了对象实例化的速度。
当一个对象通常表现为一个Singleton时,它的object pool可以使用Quasi-Singleton来提供allocate block的效率。
Object Morphing动态的改变一个对象的类来避免重新构建它的花费。
Ojbect Nullification通过使删除的对象无效来检测stale object的引用。

2. 抢占式的调度是不可接受的,主要的原因是这样会强制使用Semaphores来保护critical regions,而这些是极容易引入bug的。
Cooperative Scheduling通过提供一个全局锁来允许每个事物都运行完成,而消除了这种风险。
Run to completion timeout保护了事物不会运行时间太久。
一个Thread类提供了一个Wrapper facade和Thread-specific Storage来封装native thread,同时也提供了函数来支持cooperative scheduling。
I/O threads接收外部消息并将这些消息放入work queue,并交由invoker thread来处理。
这些线程和work queue实现了Half-sync和Half-async,这能将I/O和应用程序解耦。
这允许系统定义优先级,由于以后的负载控制。
当一个invoker thread将一个消息交给状态机时,接下来的事物会run to completion。状态机之间仅能使用异步消息来通信,但是这样会在一组相互的协作状态机中创建一些transient状态。
Run to completion Cluster解决了这个问题,它提供了一个优先级的内部处理器消息,使得状态机集群可以在处理其他输入之前达到一个稳定状态。

3. Heterogeneous distribtuion(异质的分布)指定不同的functions到不同的处理器。
Homogeneous distribution(同质的分布)指定不同的用户到不同的处理器,这样更简单而且扩展性更好。Hierarchical distribution(分等级的分布)综合了这些方法,在一个层次里使用homogeneous,而跨层次的分布使用heterogeneous。

4. 经典的Symmetric multi-processing是有风险的,因为它需要广泛使用semaphores,这样的话只能使用共享内存来传递消息。Half-object plus protocol复制另一个处理器中一个对象的一部分来提高处理能力。

5. 电信级系统必须避免软件错误,使用模式包括Defensive coding、Loworder page protection、Stack overview、User spaces、Write-protection memory。
当错误发生时,系统必须能够检测到并启动恢复流程,使用模式包括Watchdog、Heartbeating、Leaky bucket counter。
Safety net、Audit、Escalating restarts(逐步升级重启)、Initialization framework、Binary database。


6. 一个电信级系统主要由消息进行驱动,所以消息系统必须高效和稳健的。Reliable delivery保证了内部消息可达,当目的地是可达的且在服务时。这避免了重传消息。Message attenuation(细度消息)避免了消息风暴,通过捆绑消息或过段时间再发送消息。
TLV message使用了tlv进行编码。因为它对参数单独编码,允许Parameter typing来对待每一个参数为一个struct(由Parameter template初始化)。如果一个应用程序在一个参数的最后之前进行了写操作,Parameter fence会检测到错误,Parameter dictionary提供了更快的方式来访问一个消息的参数。
消息copy,是系统性能的灾难。In-place encapsulation在一个消息缓存的头部保留了空间,使得在消息travels down协议栈时,消息头可以预先填写。Message cascading允许一个应用程序发送消息到多个目的地而不用重新构建它。Message Relaying允许应用程序转发一个消息到下一个目的地而不用重新构建它。Eliminating I/O stages减少了调度次数和copy操作,在一个消息最终到达目的应用时。
消除copy操作提高了性能,但是消除消息更好。Prefer push to pull使用push方式而不是request-response方式。No empty acks、Polygon protocol(多边形协议)、Callback、Shared memory。

7. 当系统接收了很多work而处理不了时,需要使用负载控制来避免crash。使用的模式包括Finish what you start、Discard new work、Throttle new work。

8. 处理器故障时的处理,使用的模式包括Load sharing、Cold standby、Warm standby、Hot standby、Application checkpointing、Object checkpointing、Memory checkpointing、Virtual synchrony。

9. 系统升级时,使用的模式包括Hitless patching、Rolling upgrade、Protocol backward compatibility、Hitless upgrade、Object reformatting。

10. 其他的模式包括Configuration parameters、Operational measurements、Logs、Alarms、Maintenance、Conditional compilation、Software targeting、Run-time flag、Software error log、Software warning log、Object dump、Flight recorder、Function tracer、Message tracer、Tracepoint debugger、Set the capacity benchmark、Transaction profile、Function profile、Thread profile。


注:文章参考Greg Utas的Robust Communications Software一书的第二章,在其主页http://www.pentennea.com/book.html上有此章内容下载。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值