这篇论文描述了如何设计保证因果一致性又不牺牲 可用性的分布式存储系统。与传统的强调可用性的分布式系统相比,因果一致性模型对程序员更加友好,又不牺牲 性能。
Paper Review: Deep Neural Networks for YouTube Recommendations
这篇论文描述了YouTube的一个召回和排序模型,是整个推荐系统的一部分,但是也比较完整,从数据处理、召回 到排序生成最终的推荐列表都有描述,是学习一个推荐系统的绝佳材料,其中很多细节也很值得学习。
Paper Review: Google Dapper
本文对Google的论文”Dapper, a Large-Scale Distributed Systems Tracing Infrastructure“的总结,这篇论文描述了Google的分布式跟踪系统Dapper.
编译独立的Tensorflow Serving库
Tensorflow Serving的官方文档仅支持编译集成gRPC的模型预测服务,不方便开发者集成自己的框架中。本文将介绍一种方法编译独立的静态Tensorflow Serving库,开发者可直接调用Serving的API进行模型预测,方便集成至自己的服务中。
用Tensorflow C++ API训练模型
用Tensorflow解决机器学习的问题时通常是用Python API构造模型并训练模型参数,然后将模型序列化到文件中。部署到线上时使用C++ API加载模型对输入进行预测。Tensorflow还专门提供了Serving模块来优化线上部署,除了进行预测外还提供了对模型的版本管理和模型热更新。但是为了更快地训练模型,缩短模型更新周期,就必须支持线上实时训练,也就是说必须支持用C++ API训练模型。但是C++ API目前还不完善,还不方便构造模型,所以仍然使用Python API构造模型,并导出给C++ API加载训练。
本文给出两种方法来编译C++库,一种是共享库,一种是静态库。
分布式系统的分区管理
当数据量大到单机存不下时就需要分布式存储系统。分布式存储与单机存储最大的区别就是把数据按一定规则切分 为多个部分,每个机器只存储其中一部分,这样理论上来讲分布式存储可以应付无穷大的数据量。但是这里带来一 个新的问题,即如何找到我需要的数据是存储在哪台机器呢?这就是分布式系统的分区管理模块需要解决的问题, 除了这个问题外,还需要解决负载均衡和容灾的问题。
分区管理是有一定成本的,随机器数量增加而增加,所以分布式存储的伸缩性不是无穷的,伸缩能力主要取决于 分区管理。所以分区管理是分布式系统中相当重要的模块。
本文将介绍分区管理的一般解决思路,并介绍实际的分布式系统的解决方案,最后总结不同需求场景下应采用的 解决方案。
UNIX信号
Introduction
UNIX信号在编程中用的不多,但是对于长时间运行的程序还是很有用的,比如通知程序重新加载配置文件、提早退 出打印一些信息、监控子进程是否还活着。
本文将澄清UNIX信号的概念,使用信号的注意事项及常用的编程模式。
线程私有存储
Introduction
线程私有变量(Thread Local Storage)之于线程相当于静态变量之于进程,与进程变量相比是每个线程都有一份, 也就是所谓的“私有”。也可以把线程私有变量理解为key-value对,其中key是线程ID。它的主要作用是在多线程编程 中避免锁竞争的开销。本文将重点介绍线程私有变量的几种形式、用法及其背后的实现原理。
使用Feature Flags进行并行开发和持续集成
Introduction
在服务开发过程中经常需要一边修复线上bug,一边又要开发新特性,而且可能需要同时开发好几个新特性,不同 的新特性开发持续的时间不等。这样要等到所有代码都开发完、测试好需要很长时间,代码一直处于无法上线的状 态,无法敏捷响应需求。如果这时候线上又出现紧急bug,就没法及时发布修复。
用MySql实现事务型消息队列
Introduction
在离线数据处理系统中,为了解除模块之间的耦合关系,往往需要消息队列来实现模块之间的通信。对于离线系统来讲,消息队列要满足以下要求:
- 消息不能丢失,即使在系统失败的情况下。消息一旦被插入就一定会被至少处理一次(只被处理一次是最好的,但是实现起来有难度,所以只要求at-least-once semantic);
- FIFO顺序;
- 支持多生产者;
- 支持多消费者。每个消息只能被其中一个消费者处理。