姜茶.Blog

这是一个正在成长的程序员

多线程开发

阻塞队列

阻塞队列是多线程中常用的数据结构,对于实现多线程之间的数据交换、同步等有很大作用。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素的容器。 考虑下,这样一个多线程模型,程序有一个主线程 master 和一些 worker 线程,master 线程负责接收到数据,给 worker 线程...

后台开发

微服务相关的一些问题

微服务架构 背景 传统的WEB应用核心分为业务逻辑、适配器以及API或通过UI访问的WEB界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等。 通常我们把所有的模块写在同一个程序中单体打包,部署在服务器,比如对于 java 应用来说,可以打包成 jar 或者 war ,部署在 Tomcat 容器中。 这种传统方式适合于小型业务,开发快、代码集...

负载均衡

一致性哈希

一致性哈希 前面我们讲过了常见的负载均衡,但面试中常常会问到些更深层的问题,比如一致性哈希,本文我们探讨下什么是一致性哈希。 问题由来 :在使用n台缓存服务器时,一种常用的负载均衡方式是,对资源o的请求使用hash(o) mode n来映射到某一台缓存服务器。当增加或减少一台缓存服务器时这种方式可能会改变所有资源对应的hash值,也就是所有的缓存都失效了,这会使得缓存服务器大量集中地向原...

双机热备份

如何通过 keepalived 实现双机热备份

双机热备份 前文我们讲了负载均衡,通过在多个后端服务器前加设一个负载均衡服务器(Load Balancing),对接入的请求分发给后端服务器。可以实现水平扩容,提升总体服务性能的功能;还可以将少量大的宕机后端服务器剔除队列,实现冗余服务器,提高服务稳定性的作用。 这时机智的小伙伴便会提出疑问:万一负载均衡服务器宕机了怎么办? emmm,我们可以在负载均衡服务器前再加一层负载均衡服务器,...

后台开发之负载均衡

关于负载均衡,你需要知道的都在这儿

负载均衡 Load balancing 负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。 主要作用是将大量...

搞定技术面试

Unix 五种 IO 模型

Unix 五种 IO 模型 Unix 的 IO 模型有哪几种?分别是咋样的? 各种IO模型有什么特点? 阻塞和非阻塞的区别? 同步和异步的区别? epoll 为什么比较高效? IO 模型 Unix 提供了五种 IO 模型,分别是阻塞式IO、非阻塞式IO、IO复用、信号驱动式IO、异步IO。 一个IO操作通常包括两个阶段: 等待数据准备好; 从内核向进程复...

搞定技术面试

图算法相关内容

图 图的基本表示 表示一个图有两种标准方法:图邻接表和图的邻接矩阵; 邻接矩阵就是用数组(二维)表示图。具体可以看下面例子。当然,这种情况很容易造成空间浪费,所以很多人进行空间优化,甚至是邻接表的方式。 邻接表咋是数组嵌套链表,这样会比邻接矩阵省不少空间,但对无向图来说,依旧会浪费一半的空间。 在本文中,使用 G=(V,E) 表示一个图,V表示顶点,E表示边。 图的常见概念 ...

给 Github pages 用上 CDN加速

阿里云 & 腾讯云

给博客用上 CDN 加速 我们先假设大家已经知道如何使用 github pages 托管自己的静态博客网站了,这样我们不用花钱自己维护一个云服务器,也不需要在C某家充满广告的博客网站上写博客,很美好对吧。 但 Github pages 在国内的效果不佳,常常出现打开缓慢、或者无法打开等情况。 为了提高网站的访问速度,除了减少网页的请求数量,精简网页所依赖的js、css文件外,最常用的就是...

操作系统

C 程序的存储空间分布

C语言程序的存储空间布局 C程序一般有以下几个部分组成 正文段 初始化数据段 未初始化数据段 栈 堆 正文段:存储CPU执行的机器指令部分,正文段常常是只读的,防止其他程序意外修改指令;正文段可以共享,同一个程序运行多个时,系统内只有一个正文段的副本。 初始化数据段:通常称为数据段,包含了明确需要赋初值的变量。这个分区一般存储所有赋初值了的全局变量和静...

操作系统

在 main() 函数运行前发生了什么

在 main函数之前发生了什么 对于编程人员来讲,main 函数是程序的入口,但事实上 main 函数之前也发生了很多操作。在 main 函数开始前,分成两部分 “系统调用部分” 和 “C++ 程序自身的部分”。 我们首先假设程序的 main 函数原型是int main(int argc, char *argv[]);,其中,argc 指命令行参数的数目, argv 是指向参数的各个指针...