2022-02-28_星期一

消息队列高手课

据压缩不仅能节省存储空间,还可以用于提升网络传输性能。

什么情况适合使用数据压缩?

  • 如果你的应用处理业务逻辑就需要耗费大量的 CPU 资源,就不太适合再进行压缩和解压。
  • 如果你的系统的瓶颈是磁盘的 IO 性能,CPU 资源又很闲,这种情况就非常适合在把数据写入磁盘前先进行压缩。
  • 如果你的系统读写比严重不均衡,你还要考虑,每读一次数据就要解压一次是不是划算。

压缩的本质是资源的置换,是一个时间换空间,或者说是 CPU 资源换存储资源的游戏。

应该选择什么压缩算法?

目前常用的压缩算法包括:ZIP,GZIP,SNAPPY,LZ4 等等。选择压缩算法的时候,主要需要考虑数据的压缩率和压缩耗时。

  • 一般来说,压缩率越高的算法,压缩耗时也越高。如果是对性能要求高的系统,可以选择压缩速度快的算法,比如 LZ4
  • 如果需要更高的压缩比,可以考虑 GZIP 或者压缩率更高的 XZ 等算法

在选择压缩算法的之前,用系统的样例业务数据做一个测试,可以帮助你找到最合适的压缩算法。

Kafka 是如何处理消息压缩的?

Kafka 在生产者上,对每批消息进行压缩,批消息在服务端不解压,消费者在收到消息之后再进行解压。

  • 简单地说,Kafka 的压缩和解压都是在客户端完成的。

在使用 Kafka 时,如果生产者和消费者的 CPU 资源不是特别吃紧,开启压缩后,可以节省网络带宽和服务端的存储空间,提升总体的吞吐量。

后端技术面试 38 讲

组件内聚原则

复用发布等同原则

软件复用的最小粒度应该等同于其发布的最小粒度。

如果你希望别人以怎样的粒度复用你的软件,你就应该以怎样的粒度发布你的软件。

共同封闭原则

应该将那些会同时修改,并且为了相同目的而修改的类放到同一个组件中。

共同复用原则

不要强迫一个组件的用户依赖他们不需要的东西。

组件耦合原则

无循环依赖原则

组件依赖关系中不应该出现环。

一旦系统内出现组件循环依赖,系统就会变得非常不稳定。一个微小的 bug 都可能导致连锁反。

稳定依赖原则

组件依赖关系必须指向更稳定的方向。

根据稳定依赖原则,不稳定的组件应该依赖稳定的组件,而不是反过来。

如果一个组件被更多组件依赖,那么它需要相对是稳定的 如果一个组件依赖了很多的组件,那么它相对也是不稳定的

稳定依赖原则通俗地说就是,组件不应该依赖一个比自己还不稳定的组件。

稳定抽象原则

一个组件的抽象化程度应该与其稳定性程度一致。

一个稳定的组件应该是抽象的,而不稳定的组件应该是具体的。


组件的边界与依赖关系划分,不仅需要考虑技术问题,也要考虑业务场景问题。易变与稳定,依赖与被依赖,都需要放在业务场景中去考察。有的时候,甚至不只是技术和业务的问题,还需要考虑人的问题,在一个复杂的组织中,组件的依赖与设计需要考虑人的因素,如果组件的功能划分涉及到部门的职责边界,甚至会和公司内的政治关联起来。

高并发架构实战课

视频上传时序图如下:

20220228125408.png

QuickTok 使用 MPEG–DASH 流媒体传输协议进行视频流传输,因为这个协议具有自适应能力,而且支持 HTTP。

HDFS 适合存储大文件,大文件减少磁盘碎片,更有利于存储空间的利用,同时 HDFS NameNode 的访问压力也更小,所以我们需要把若干个视频文件合并成一个 HDFS 文件进行存储,并将存储相关的细节记录到 HBase 中。

20220228125434.png

用户的大部分请求都可以通过 CDN 的好处:

  • 一方面可以极大加快用户请求的响应速度
  • 另一方面又可以较大缓解数据中心的网络和硬盘负载压力,进一步提升应用整体的性能

考虑到了短视频的特点:大 V、网红们发布的短视频会被更快速、更广泛地播放。因此针对粉丝量超过 10 万的用户,系统将采用主动推送 CDN 的方法,以提高 CDN 的命中率,优化用户体验,如图: 20220228125519.png

通过大数据平台的机器学习引擎来完成缩略图的生成和推荐:

20220228125532.png

Rust 权威指南

与数据竞争不同,在编译期彻底防止内存泄漏并不是 Rust 作出的保证之一,这也意味着内存泄漏在 Rust 中是一种内存安全行为。

使用 Rc<T> 的引用来调用 Rc::downgrade 函数会返回一个类型为 Weak<T> 的智能指针,这一操作会让 Rc<T>weak_count 的计数增加 1,而不会改变 strong_count 的状态。Rc<T> 类型使用 weak_count 来记录当前存在多少个 Weak<T> 引用,这与 strong_count 有些类似。它们之间的差别在于,Rc<T> 并不会在执行清理操作前要求 weak_count 必须减为 0

Rc::downgrade 函数返回的 Option<Rc<T>> 会在 Rc<T> 值依然存在时表达为 Some,而在 Rc<T> 值被释放时表达为 None

强引用可以被我们用来共享一个 Rc<T> 实例的所有权,而弱引用则不会表达所有权关系。一旦强引用计数减为 0,任何由弱引用组成的循环就会被打破。因此,弱引用不会造成循环引用。

通过在 Node 定义中将子节点指向父节点的关系定义为一个 Weak<T> 引用,可以使父子节点在指向彼此的同时避免产生循环引用或内存泄漏。

Box、Rc、RefCel

  • Box<T> 类型拥有固定的大小并指向一段分配于堆上的数据
  • Rc<T> 类型通过记录堆上数据的引用次数使该数据可以拥有多个所有者
  • RefCell<T> 类型则通过其内部可变性模式使我们可以修改一个不可变类型的内部值;它会在运行时而不是编译时承担起维护借用规则的责任

断舍离

断舍离——螺旋上升式的人生路线:

20220228183245.png 断舍离,是清爽流畅感的“场”“空间”“时间”的创造方法。 它不是“要、不要”的短视视点,而是: 我想要什么样的状态? 空间想要什么样的状态?

断舍离面对问题时,首先从认识现状开始。通过对杂物的选择取舍,了解自身。

遇到任何事情,并不是仅仅归结于“幸运或不幸”,应该将其作为某种体验,能以一种从容豁达的真我视角来看待人生各种各样的不同境遇。

“杂物整理”与“空间创造”的不同: 20220228183550.png 居所就是身体的容器,而身体则是生命的栖居之处,因此,居所里放置的应该是能让生命健康成长的东西。

断舍离最核心的思想就是“新陈代谢”。我们的居住空间处于代谢(交换)的状态是最理想的,因此,不断地进行“使用所有物,清除无用之物”的循环,才能让居所充满流动感和活力。

updatedupdated2022-03-092022-03-09