/images/hugo/avatar.png

13. 软件架构设计中的常见问题

哪些常见的软件设计问题

1. 消息队列

1.1 消息系统的实现方式

消息系统采用发布/订阅模式,为了区分不同的消息系统,提出以下两个问题对区分很有帮助:

  1. 如果生产者发送消息的速度比消费者能处理的快,会发生什么?
    • 一般有三种选择: 系统丢弃消息;将消息缓存在队列中;激活背压(流量控制,即阻止生产者发送消息)
    • 如果消息被缓存在队列中,那么队列增长时会发生什么非常重要
    • 如果内存无法容纳所有队列,系统是否会崩溃,还是消息会被写入磁盘
    • 如果消息会落盘,又会如何影响消息传递系统的性能
  2. 如果节点崩溃或者暂时离线,是否会有消息丢失?
    • 持久化需要写入磁盘或者结合复制方案,这些都是有成本的
    • 如果能够接受消息丢失,那么同样的硬件上可以获得更高的吞吐量和更低的延迟

消息传递有如下几种方式:

13. 数据系统的未来

如何构建现代数据系统

1. 构建现代系统

前面我们讨论当前流行的技术,接下来我们综合之前所说的所有知识,来谈谈未来的系统应该是什么样子。

1.1 数据集成

首先每个软件,即使所谓的通用数据库,也是针对特定的使用模式而设计,第一个挑战就是弄清楚软件产品与他们适合运行环境之间的关系。

12. 流处理系统

派生数据

1. 流处理系统

前面讨论的批处理系统存在一个重要的假设: 输入是有界的,是已知的有限大小,所以批处理知道何时读完他们。比如MapReduce 核心的排序操作必须读取整个输入,然后才开始生成输出。

11. 批处理系统

派生数据

1. 组合的数据系统

前面我们讨论了分布式系统所有主要注意事项,但是这些讨论都只包含一个数据库。事实上数据系统是复杂的,通常需要以多种方式访问和处理数据,并且一个数据库往往无法同时满足所有不同的需求。因此应用程序需要使用若干不同的数据存储区、索引、高速缓存、分析系统等的组合,并实现数据从一个存储系统移动到另一个存储系统。