高性能服务端一般解决方案

1.避免锁

1.1 预分配,外部不允许修改内部状态等

2.避免IO

3.异步化

4.数据落地尽可能批量化

 

另外,从应用建模时候尽可能让数据维护本身自己,而非外部系统修改(可以天然的并行化,而不需要考虑锁),具体来说DDD,ACTOR等等都是这种思想.

在一个理想状态下,不考虑跨语言的情况下,每个对象只能由自身维护其数据的情况下,那么扩展性能够达到最大,因为完全避免的锁

消息队列设计

自行设计消息队列

需求描述

  1. 能够存储消息
  2. 能够获取消息
  3. 能够区分topic

接口设计

时序图

消息入队:

消息出队:

拓展点:

完全依赖Storage作为拓展点,若是单机消息队列,则直接实现单机Storage

若是集群存储则实现集群Storage

若是分布式存储则实现分布式的Storage

所有上层操作依赖Storage接口

已经默认实现了的单机Storage

分别是CompressFileStorage, SplitFileStorage

分别实现场景是,单消息单文件存储

多消息单文件存储

Github地址:

https://github.com/michaelssss/MyQueue

DDD(领域驱动设计)

1.确定领域界限(通常由领域专家和架构师共同确定)

2.抽象领域的套路,就是通过和领域专家交流,确定出在当前领域下的各种套路

Example:

以软件发布作为一个领域来陈述:

首先确定,当前业务界限(已开发完毕,通过测试,需要在某个商城或者平台上架)

接下来,涉及,当前商店的适配(Adapter),提交审核(Commit,Audit),最后是上架(sell granted/publish)

以上作为最基本的讨论术语。而这些专业名词,也就是俗称的套路。

3.通过动态验证模型是否满足需求,否则转2。

不断的重复交流并验证,最终得出一个模型。(类似于软件开发中的迭代,这里是模型的迭代,而非软件的迭代,但模型的迭代能够深层次的影响软件的迭代)

只要模型抽象的足够好,面向对象中的SOLID原则会自然而然的呈现,而非刻意而为。