数据密集型
数据密集型-IO密集型
计算密集型-CPU密集型
数据系统的架构--Architecture
存储和处理数据的工具和技术--技术迅速变化的背后总会存在一些持续成立的准则
数据量--数据量特别大,特别多
数据复杂--数据理解
数据更新和变化速度--速度快
数据
数据的正确性和完整性
数据系统
数据存储-数据传输-数据搜索<查询查找>-数据处理
都会存储一段时间的数据--数据存储贯穿整个流程,只是在数据存储环节中更为关键
可靠性-可扩展性-可维护性
旧版本的代码,以及新旧数据格式可能会在系统中同时共处。
系统想要继续顺利运行,就需要保持双向兼容性
新代码读取老数据,老代码可以读取新数据(旧版的程序需要忽略新版数据格式中新增的部分)
老人老办法、新人新制度,中人逐步过渡-进入实质性启动阶段,平稳过渡,公平体系渐成
数据版本控制
两种形式的数据:
内存数据-数据位于内存中--进程中的指针对于其他进程没有意义,所以内存中使用的数据结构和
将某些数据发送到 不共享内存的另一个进程 --它编码为一个字节序列
将某些数据发送到 共享内存的另一个进程
字节序列-数据写入文件或者通过网络发送--从内存中表示到字节序列--编码-序列化
字符等
数据版本控制
json xml csv
Thrift和Protocol Buffers都需要一个模式来编码任何数据 依赖于代码生成
Apache Avro 是另一种二进制编码格式,
Avro PB Thrift 使用模式来描述二进制编码格式
模式不可避免地需要随着时间而改变。我们称之为模式演变。基于模式的二进制编码
数据类型的变化
可靠性
fault--fault-tolerant 容错和韧性--安全阈
阻止错误和容忍错误--消灭错误-预防错误
硬件故障--软件错误--人为错误
常见措施: sandbox-沙箱 版本管理--快速回滚
监控--遥测(telemetry)
服务降级--服务分类分级
数据流动
什么是数据流:数据流:应用代码与状态变化的交互
将数据库的变更日志视为一种我们可以订阅的事件流
现状 :
无状态客户端和请求/响应交互的假设
离线优先(offline-first) 的应用 --本地数据库--可以看作服务器状态的缓存
从请求/响应交互 转向 发布/订阅数据流
更具响应性的用户界面与更好的离线支持
到更多的自我验证(self-validating) 或自我审计(self-auditing) 系统,不断检查自己的完整性,而不是依赖盲目的信任
数据流动
通过数据库的数据流
通过服务调动的数据流 REST使用URL来标识资源
通过异步消息传递的数据流
远程服务调用(Remote Procedure Call,RPC) 远程过程调用(RPC)
先解决两个进程间如何交换数据的问题,也就是进程间通信(Inter-Process Communication,IPC)
单机多进程
消息队列和共享内存只适合于单机多进程间的通信,
不同机器之间的进程--host之间
套接字接口是更为普适的进程间通信机制,可用于不同机器之间的进程通信
RPC 的定义:远程服务调用是指位于互不重合的内存地址空间中的两个程序
如何表示数据?
如何确定方法?
如何传输数据?
二进制编码格式的自定义RPC协议
JSON over REST
消息队列: 发送者通常不期望收到其消息的回复-单向数据流
actor模型 为actor模型
分布式的Actor框架实质上是将消息代理和角色编程模型集成到一个框架中
Unix和关系数据库以非常不同的哲学来处理信息管理问题。
Unix 认为它的目的是为程序员提供一种相当低层次的硬件的逻辑抽象,Unix发展出的管道和文件字节序列,
关系数据库 则希望为应用程序员提供一种高层次的抽象,以隐藏磁盘上数据结构的复杂性,并发性,崩溃恢复以及等等。 数据库则发展出了SQL和事务
跨系统同步写入的问题,跨多个不同系统的只读查询问题
只有当没有单一软件满足您的所有需求时,才会出现拆分和联合的优势。
使用应用代码组合专用存储与处理系统来分拆数据库的方法
Docker,Kubernetes等部署和集群管理工具专为运行应用代码而设计
生态系统
生态系统:是由生物群落及其生存环境共同组成的动态平衡系统
组成成分:
食物链--食物网
生态系统的自我调节能力的强弱关键在于生态系统的稳定性强弱,
内在原因是生态系统的自我调节,负反馈调节是生态系统自我调节的基础,正反馈调节是一种促进性调节机制,它能打破生态系统的稳定性
而稳定性有两方面——抵抗力稳定性和恢复力稳定性
受损生态系统的恢复和重建-生态系统发育具有阶段性,即具有相对稳定的暂态
假设和约束
复杂性和变化性
应用程序不可避免地随时间而变化--可演化性(evolvability)
分而治之
epoch 一个epoch意味着模型已经见过了所有的训练数据一次
batch 每个batch中,Batch Size
1.一个Batch中的数据分为若干个小批次(mini-batch),每个小批次都会经过一次前向传播和反向传播的过程,这个过程就是一次迭代(Iteration)
Iteration 神经网络在训练过程中每一次参数的更新
项目和产品
分拆系统vs集成系统
项目:最重要的是--利益相关方
最重要的把握--变更
检验标准--客户满意度
产品: 最重要的是--核心价值
最重要的把握--迭代
检验标准-- 核心价值交付的成功率和用户体验
解决方案:
有什么产品不是最重要的,最重要额是客户要什么
在项目交付中充分积累开发经验和领域知识,最终再合适的时机和市场环境以及获得相应的额
项目是把事情作对,产品是做对的事情。
项目的重点是交付--衡量方法-日程和时间表-平衡的思维
产品的重点是结果--了解客户,解决什么问题,真有这种问题吗?
产品--项目--技术
每个系统都服务于一个目的;我们采取的每个举措都会同时产生期望的后果与意外的后果
让我们做一个思想实验,尝试用监视(surveillance) 一词替换数据(data),再看看常见的短语是不是听起来还那么漂亮
并不是所有的数据收集都称得上监视 用户几乎不知道他们提供给我们的是什么数据
参考
数据系统的未来https://vonng.gitbooks.io/ddia-cn/content/ch12.html