软件设计

设计是把一种设想通过合理的规划,周密的计划,通过各种感觉形式传达出来的过程。设计是将目标更好变现的过程。回到软件设计上来,就体现在如何将软件高度抽象,解耦以达到分而治之的过程。

设计是如此重要,我们既要具备对事物的抽象解耦能力,又要能够从细节上作把控,做到大处着眼,小处着手。

对于方法论,软件设计领域也诞生了很多软件设计思想,比如面向过程设计面向对象设计面向服务设计面向消息设计面向失败设计等,每种思想也都是在企业软件发展不同阶段解决某个领域或某一类的问题,没有好与坏的区别。

任何一点点的故障都可能带来严重的后果,因此面向失败设计显得尤为重要。我们需要横向从网络,dns,cdn,软负载,中间件,容器,存储,数据库等维度去梳理沉淀经验,也需要从纵向运维发布,监控报警,管控平台,调度,环境部署等维度梳理。 以下常用的参考指标:

  1. 编码设计 模块,服务,字段等设计的时候,需要考虑命名的可读性,见名知意,避免产生歧义。 接口设计需要满足开闭原则。
  2. 分布式设计 需要考虑一致性,避免脑裂问题产生。
  3. 缓存设计 确定命中率指标的前提下,需要持续观察未命中数据特征,特别是无效的查询,容易穿透缓存,命中数据库。
  4. 容量设计 自身稳态及尖刺容量评估确定的前提下,做好容量保护相应措施,比如限流,降级,隔离等
  5. 依赖设计 做好强弱依赖梳理,避免核心功能依赖非核心系统,非核心流程节点,能走异步最好走异步。
  6. 日志设计 系统日志尽可能异步化,尽量避免无效日志,控制台日志输出
  7. 监控设计 关键监控项及SLA的指标必须要做监控,监控项尽可能覆盖全,同时要做到有效报警,不要让大量无效报警淹没有价值的报警信息。
  8. 权限设计 本着够用原则,避免出现大权限,大账号,如果避免不了,需要做天花板限制。
    表结构设计 分库分表需要考虑热点数据问题,时刻关注表的数据量大小