A collection of 15 posts

服务化架构的演进

第一阶段:服务拆分与聚合 底层业务进行RPC拆分; 上层聚合业务进行REST拆分; 优点 API接口和rpc业务服务分层 业务按高内聚低耦合的方式拆分 基本实现了业务的服务化 部分业务服务下沉支撑多产品线公用 不足 流量调度能力欠缺 无实际意义耦合,抗风险能力欠缺 监控和治理能力欠缺 业务拆分依然存在不合理耦合 第二阶段:服务划分、网关接入 按业务类型进行更精细服务划分; 适度的聚合业务REST服务拆分引入接入网关; ...

《数据密集型应用系统设计》整理10

第十一章 流处理系统 为了解决批处理需要一定时间后才能处理的问题,流式处理在每秒钟结束时(甚至持续不断)处理每秒的数据,完全放弃固定的时间片,有事件就处理。 “流”是指随着时间的推移而持续可用的数据。 发送事件流 在流处理的上下文中,记录通常被称为事件,但本质上跟批处理是一回事:一个小的、独立的、不可变的对象。 数据产出后的流转阶段,批处理选择通过文件或数据库连接生产者和消费者:生产者将其生产的每个事件写入数据存储, ...

Redis vs Memcached?

指标 Redis Memcached 网络IO模型 单线程的IO复用的网络模型 多线程的非阻塞IO复用的网络模型 支持的数据结构 key-value数据类型,还支持list、set、zset、hash等 key-value形式存储和访问数据 内存管理机制 现场申请内存 预分配的内存池 数据存储及持久化 in-memory、支持持久化:快照、 ...

缓存架构的实现

缓存架构的实现需要解决的最主要的问题就是如何更新缓存,具体有由业务方更新和由后台线程更新两种方式: 业务方更新:业务方请求不到缓存数据之后,去存储系统中获取并生成缓存数据。这里需要解决的一个问题是如果多个业务方同时遇到缓存失效的问题,那么所有业务方都会请求存储系统并更新缓存,这样会对业务系统和缓存都造成很大的压力。这时候需要有个分布式锁,保证只有一个线程能进行缓存更新,未获取锁的线程要不就等锁释放后重新读取缓存,要不就返回空值。 后台线程更新:缓存时效设置为永久,由后台线程去更新缓存。这里需要解决的问题是有一些key会被踢出缓存系统的情况。这里可以有两种处理方式,第一种是后台线程频繁的读取缓存,把被踢出的key再加入缓存;一种是业务方获取不到key之后, ...

一致性哈希

经典的哈希方法使用哈希函数来生成伪随机数,然后除以内存空间的大小,将随机标识符转变成可用空间内的一个位置。 结果看起来如下:location = hash(key)mod size。 在分布式的场景下,我们需要一种机制将请求均匀的分布到节点上,以实现负载均衡。 如果使用hash方法,则节点有变动(增加删除)的时候,我们最终需要重新计算每一个键的哈希值,因为新映射依赖节点数量/内存位置。 只是重新计算哈希值的分布式系统( ...