自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 关于架构的认知

我们先来看看“架构”的含义:架构是软件整体结构与组件的抽象描述,它定义了系统涉及到的各个元素,并将这些元素通过一定的规则联合起来,协同完成整体的目标功能。而这一过程的产物就是所谓的架构图,它将涉及的元素和关系可视化出来,形成有标注、有说明的构建蓝图。实际上,架构它将需要面向多种人群进行阐述,比如 boss 想要了解的是概念,产品经理想看到的是设计,而开发工程师关心的则是能力边界。因此,我们往往会自顶向下的考虑软件的体系结构。从概念、模块、运行、代码的角度去组织。...

2022-08-07 19:52:29 971 1

原创 程序员都应该知道的 21 个 Git 命令

诞生于2005年的分布式版本管理工具Git,现如今已成为大多数公司协同合作的必备工具之一了。它直到现在依然保持着简单易用、高效管理的特点。相信很多刚踏入职场的猿友们,第一个需要学会使用的就是Git。今天,我们来重温经常使用的20个Git命令,也可当做自己的Git命令速查表。...

2022-07-24 18:05:10 1534

原创 分布式链路追踪

前言传统的单体服务通过日志和性能监控为我们的系统提供了良好的观测手段,随着服务之间的交互越来越多,越来越复杂,这种“各自为政”的策略将使我们看不到整体的关联性。为了提高系统的可见性观察,分布式链路追踪被提了出来,并迅速发展。背景分布式体系的构建是以“拆”为核心,其目标是职责分明、高度自治。不同的模块甚至会由不同的团队负责,用不同的语言编写。当我们想要组合这些服务,对外提供统一功能时,我们还需要考虑它的一个可观察性。比如,请求里的服务依赖有哪些,各个节点的耗时是怎么样的,瓶颈在哪里等。像这种涉及上下文

2022-04-04 10:38:36 2824

原创 Prometheus 监控系统

前言软件的开发不仅仅在于解决业务,它还需要程序尽可能的运行下去,这就涉及到了服务的稳定性。稳定性涉及很多因素,硬件软件都需要保证。为了能让这些条件更加充足,我们需要不断的收集数据,分析数据,监控数据,进而优化能优化的点。Prometheus 在这方面就为我们提供了很好的监控方案。什么是 Prometheus?Prometheus 是一个开源的监控和报警系统,它将我们关心的指标值通过 PULL 的方式获取并存储为时间序列数据。如果单从它的收集功能来讲,我们也可以通过 mysql、redis 等方式实现。

2022-03-26 22:58:33 3414

原创 搜索引擎Elasticsearch简介实践

前言之前在寻找日志收集搜索解决方案时,最常看到的便是 ELK:Elasticsearch + Logstash + Kibana 方案。尽管由于它对服务器资源要求很高转而使用 了 Loki,但也对它初步研究过。今天,就对其中的 Elasticsearch 深入了解一番。Elasticsearch 介绍Elasticsearch 是一个开源的搜索引擎,我们可以用它来处理文本、地理空间(如坐标)、结构化(如 DB 里的表)、非结构化(如报表、图片)等数据,然后通过简单的 REST API 对其搜索。它的最

2022-03-16 23:39:13 2393

原创 操作系统面试总结

1. 进程和线程的区别是什么 ?进程是资源分配的基本单位,线程是 CPU 调度的基本单位。进程拥有独立的地址空间,线程是共享内存地址的。进程切换的开销比线程要大。2. 进程间的通信方式有哪些?管道(Pipe):在缓存中开辟处输出和输入文件流空间,只能适用于父子进程通信。命名管道(FIFO):不同进程的管道通信,通过打开同一个 FIFO 文件进行数据传输。消息队列(MessageQueue):存放在内核中的消息链表,简单高效。共享内存(SharedMemory):允许两个不相关的进程访问同一个逻

2022-03-09 23:08:59 276

原创 gRPC 简介实践

现代的软件服务大多数是分布式应用程序,通过暴露自己的 API 对内或对外提供了一系列的功能点。服务与服务之间有时是跨语言、跨平台通信的。为了解决这些复杂场景,市面上也涌现了有很多解决方案。比如构建 RESTful 服务,将服务能力转化为资源集合;也有面向函数调用的客户端-服务器模式:远程过程调用(Remote Procedure Calls)。今天要介绍的 gRPC 就是后者的演变,一个非常受欢迎分布式进程间通信技术。

2022-03-08 23:08:55 273

原创 docker、k8s 面试总结

1. Docker 是什么?Docker 是基于容器技术实现的,容器技术最开始是基于 Linux Container(简称 LXC)技术实现的,通过内核提供的 Namespace 和 Cgroup 机制,实现了对应用程序的隔离以及物理资源的分配。Docker 在容器基础上发展出了一个完善的生态系统,它将容器视为一种打包格式,将应用程序所需的一切,比如依赖库、运行时环境等都集合在了在一起,使得一次构建,到处运行。它将开发与运维很好的融合在一起。开发人员可以很轻松的构建、打包、推送和运行应用程序。而且还允

2022-03-02 22:20:26 2374

原创 受Prometheus启发的开源日志工具:Loki

提及日志收集搜索框架,最常看到的解决方案就是 **ELK**。虽然现在有 Docker、k8s 帮我们简化了部署流程,但 **ELK** 对硬件的要求却很高。光是 **Elasticsearch** 官网就提及到需要 8 GB 内存以上的机器部署,可见占据的资源之多。为了能降本增效(**穷~~~**),在网上看到了 Grafana 团队的日志框架: **Loki**。为此进行了深入的了解并应用在了一些项目上。

2022-02-28 22:44:21 713

原创 计算机网络面试知识点

前段时间找工作搜索 golang 面试题时,发现都是比较零散或是基础的题目,覆盖面较小。而自己也在边面试时边总结了一些知识点,为了方便后续回顾,特此整理了一下。

2022-02-15 00:31:54 927

原创 场景设计汇总

1、如何设计一个秒杀系统2、RBAC 权限管理设计3、订单号的设计规则和依据4、全局唯一序列号的生成5、电子钱包/支付系统设计与分析6、如何设计一个高性能短链系统7、实时排行榜设计8、敏感词过滤9、数据量超大的实时查询,如何设计方案?10、最全面的 Redis 缓存雪崩、击穿、穿透问题解决方案11、分库分表之终极设计方案12、高并发系统的限流方案如何实现13、秒杀业务中不超卖的实现方案汇总14、百亿级微信红包的高并发资金交易系统设计方案...

2022-02-13 21:21:00 330

原创 redis 面试总结

前段时间找工作搜索 golang 面试题时,发现都是比较零散或是基础的题目,覆盖面较小。而自己也在边面试时边总结了一些知识点,为了方便后续回顾,特此整理了一下。

2022-02-10 23:15:24 791 1

原创 mysql 面试总结

前段时间找工作搜索 golang 面试题时,发现都是比较零散或是基础的题目,覆盖面较小。而自己也在边面试时边总结了一些知识点,为了方便后续回顾,特此整理了一下。

2022-02-09 23:39:43 801

原创 golang 面试总结

前段时间找工作搜索golang 面试题时,发现都是比较零散或是基础的题目,覆盖面较小。而自己也在边面试时边总结了一些知识点,为了方便后续回顾,特此整理了一下。

2022-02-08 23:17:57 639

原创 操作系统之进程管理、内存管理总结

计算机是由很多资源组成的,像我们常见的 CPU、内存、硬盘等。如果我们想要使用这些资源去完成某个计算任务,那么就需要有一个管理者来协调这些资源,操作系统就是这个管理者。

2022-01-01 12:19:24 1966

原创 关于分布式系统共识的思考

在前面的文章里,我们分析了分布式系统在业务上的一致性技术,即分布式事务,它的结果导向是面向用户的。然而在我们的系统内部,有时也需要面对来自软件架构等更高层次上的一致性要求,比如 Redis 的哨兵模式,Zookeeper 的选举过程等。它们所考虑的一致性更多的是服务节点之间一个共识的达成,当共识达成之后,就可以以此为指导原则,展开更多的协同操作。

2021-12-26 16:31:55 618

原创 关于分布式事务的一致性思考

在关于微服务的设计上,已经有很多成熟的指导方案。比如基于领域模型的,基于事件驱动的。然而,当各个服务各自为战后,在数据的一致性上,却未能有完善的解决方案。或是受性能效率限制,或是实现流程复杂。总之,我们需要采取很多额外的手段去解决分布式服务的数据一致性问题

2021-12-13 22:50:17 793

原创 计算机网络 TCP 协议总结

TCP 相关知识TCP/IP 协议占据了互联网通信的一大半江山,特别像 TCP 这种保障端到端的可靠传输机制更是相当重要,关于它的实现也很复杂,涉及的知识也很庞大。所以,今天介绍下关于 TCP 的相关重要知识。我们先来认识下 TCP 的头格式:其中,我们看到有一个源端口、目的端口,这 2 个元素再加上 IP 层的源地址和目的地址,那么这四元组就可以用来表示 TCP 的某个连接了,相当于数据库里的唯一标识。所以当我们发起一个 TCP 连接时,会发现如果存在相同的端口在运行时,操作系统是不允许的,只有这

2021-10-26 22:57:00 787

原创 docker 系列:实践工具

前言本文将介绍下在使用 Docker 时的相关经验,比如使用 Docker-compose 进行容器的编排部署,使用 Portainer 对容器进行可视化的管理,以及 DockerFile 的构建建议。相当于是一套组合拳。让我们能更轻松、更方便去管理 Docker 的容器。Docker Compose使用 Docker Compose 有一个好处就是可以通过配置化的方式去编排容器。比如我们当前有3个服务,其中 A 依赖于 B,B 依赖于 C,那么我们就可以在 YML 中使用 depends_on 配置

2021-10-20 23:45:26 97

原创 docker 系列:底层实现

总体架构Docker 采用的是 C/S 架构,使用 REST API、UNIX 套接字或网络接口进行通信。一般客户端会和 Docker 服务运行在同一台机子上,像我们平常使用的 docker build、pull、run 等命令就是发送到客户端上的。客户端也可以独立部署,比如 Docker Compose。在 Docker 服务端上,一般表现为守护进程,负责监听客户端的请求,然后进行容器的构建、运行和分发。Docker 守护进程(dockerd):侦听 Docker API 请求并管理 Docke

2021-10-20 07:45:00 251

原创 docker 系列:基础入门

Docker 与 容器Docker 是基于容器技术实现的,由于 Docker 的火热流行,可能很多人会认为容器是 Docker 独有的技术。实际上,容器技术最开始是基于 Linux Container(简称 LXC)技术实现的,通过内核提供的 Namespace 和 Cgroup 机制,实现了对应用程序的隔离以及对物理资源的分配。后来随着 Docker 的发展壮大,容器技术越来越被更多的公司接受,更是联合众多公司成立了 OCI 组织来制定了容器标准。容器技术和虚拟机(虚拟化)技术有点像,它们两者都提供了

2021-09-17 21:20:06 85

原创 架构系列:关键要素

前言架构设计是一个技术活,它不仅考验着我们对整体的抽象整合能力,也检验了我们对业务的变化应对能力。一个好的架构,能让系统的依赖关系清晰明了,也能让后续的维护成本降到最低。那到底什么才是好的架构呢?个人觉得,站在使用者的角度,好的架构应该是易于理解的、高度自治的、可衡量的;站在实施效果的角度,应该是高可用、高并发、可扩展的。易于理解我们知道,之所以要进行架构设计,其主要目的在于降低系统的复杂度。在软件行业里,改需求加功能是家常便饭的事,几乎每隔半个月就有一次小的迭代。随着变动越来越多,系统将会越来越庞

2021-09-12 22:59:10 177

原创 架构理解总结

一、怎么理解架构?假如给你一个项目开发,你会怎么开始它?对于这个问题,我想很多猿友们都应该经历过吧。很多时候,我们会直接开干,让自己快速的进入 coding 状态。然而一旦遇上稍微有点规模,比如涉及到多个业务功能的开发,那大概率会在开发过程中经常的怀疑自己,甚至产生推倒重来的想法;又或者眼看就要交付了,只能将错就错,修修补补。最后,一个让人揪心的系统又诞生了。说到底,还是太草率了,如果我们能提前对项目进行梳理,将涉及到的产品形态、业务功能、技术方案不断的进行提炼总结,那还会这样吗?这也是为什么我们需

2021-09-05 23:57:18 328

原创 redis 系列:高可用

前言Redis 作为最常用的 key-value 服务,一直为我们带来了高性能的保障。但程序嘛,总不可能一直运行下去,而我们所要做的就是将这些风险降到最低。那么,高可用也就是 Redis 必然要考虑的了,而随着 Redis 的广泛使用,市面上也出现了有很多种高可用方案。今天,就来好好认识下这些高可用方案,或许也可以为我们自己程序带来灵感。高可用机制Redis 的高可用从总体上来讲是通过 冗余 + 故障转移 来实现的,而对于冗余和故障转移又可以细化为:部分冗余 or 全部冗余;手动转移 or 自动转移。

2021-08-27 21:49:50 123

原创 redis 系列:持久化机制

持久化机制尽管 Redis 是基于内存的 key-value 服务,但也可以进行数据的持久化,以便服务重启,数据能重新加载进来。为了尽可能的保证数据不丢失,Redis 为我们提供了好几种持久化机制:RDB:即 Redis Database,在指定的时间间隔里将 Redis 内存数据镜像下来,保存到文件里。AOF:将服务器对数据的写操作追加到文件里,相当于将所有的逻辑操作都记录了下来。无持久性:不进行持久化,性能最好。RDB + AOF:将 RDB 和 AOF 结合起来,组合它们各自的优点。

2021-08-25 21:13:04 167

原创 redis 系列:总结

Redis 总体介绍Redis 是 key-value 型的 memory 缓存中间件,相信大部分程序员都在项目中使用过它。其实,我们也可以在程序里实现属于自己的 memory 缓存,只是使用 redis 的话,可以将缓存功能统一到这一组件,就像专人干专事一样,使得我们的程序和缓存功能解耦开,方便后续拓展。在底层上, redis 使用了 IO 多路复用技术,像 select、epoll 等。能较好的保障吞吐量。而且 redis 采用了单线程处理请求,避免了线程切换和锁竞争锁带来的额外消耗。加上 re

2021-08-22 21:03:50 374

原创 mysql 系列:MVCC

MVCC 介绍MVCC 全称是 Multiversion concurrency control,即多版本并发控制。从它的名字就可以看出是关于在并发时对读写控制的一种方法,基本市面上流行的 Database 都有其具体的实现。MVCC 使得各个事务在读写数据时能最大程度的降低锁的依赖,在保证事务隔离性的同时,也能让读类型的事务和写操作的事务并发进行。当我们在进行修改操作时,MVCC 会通过 undo log 保留了之前的数据记录,就像每条记录都有自己的历史版本一样。通过这些历史版本的追溯,MVCC

2021-08-21 21:32:26 165

原创 mysql 系列:日志

摘要日志的存在,为数据库的很多功能提供了保障。像用于回滚事务的 undo log,用于恢复事务的 redo log 以及用于主从备份的 binlog。本文将会大致介绍下数据库里的日志类别,以及重点分析下事务日志的相关知识点。日志分类在 mysql 里的日志种类有很多,从总体上来讲可以分为 Server 层 和 存储引擎层的(关于 mysql 的总体架构可以看这篇:mysql 系列:总体架构概述)。在 Server 层里的日志分类如下:错误日志错误日志是 mysql 在启动、运行或停止时出现异常的日

2021-08-19 23:17:52 308

原创 mysql 系列:锁和它的运用

前言数据库是一个允许多用户、多会话、多线程访问的系统。为了在并发访问中能保证数据的一致性和完整性,一般会使用事务来做控制,外加锁来作为辅助手段。所以今天整理了一下锁的相关知识,顺便看看它在事务里是怎么配合使用的。锁的分类我们先来看下锁的分类及其作用有哪一些,以便能更好的分析运用场景。乐观/悲观锁乐观锁:在读取数据时会假设各个事务互不影响,它们会各自处理好属于自己的那部分数据。如果在更新数据时,发现真的有其他事务修改了属于自己的那部分,则会回滚之前的一切操作。悲观锁:采取了先获取锁再访问的保守策略

2021-08-16 23:49:00 114

原创 mysql 系列:搞定索引

摘要索引是数据库里重要的组成部分,也是提高查询效率必备的知识点。本文将会介绍索引作用、索引类型、索引优化以及索引底层结构,也算是对索引知识的一次归纳。一、索引介绍什么是索引?数据库是用来存储与读取数据的,如何在这庞大的数据中查询我们想要的那一行呢?最简单的办法便是扫描整个数据表,一一对比。然而这样效率太低了。如果我们有类似字典的功能,在查询某行数据前,先到字典里定位到行位置,再根据行位置找到具体数据,是否能更快呢?是的,索引就是这么设计的。一般的,我们往表里插入某一行数据时,总会有额外的信息来定

2021-08-15 10:44:44 92

原创 来,上一上 IT 历史课!

雏形初现给你一台 1804 的织布机,你能想象它是计算机的灵感来源吗?没错,那一年法国发明家雅卡尔发明了高效率的织布机,他通过对穿孔的有无来控制了编织的图案。这种打孔模式其实就是变相的在存储图案路线,再用机械还原图案,这和现代的计算设备理念是一致的。后来,著名的英国数学家查尔斯·巴贝奇利用这打孔模型,在 1822 年提出了根据穿孔卡上的指令存储数据,以进行任何数学运算的可能性,并着力打造其设想机器:差分机。只可惜的是,由于各种原因,直到巴贝奇去世,也没有将其完整的实现出来。不过,打孔技术可没有被遗忘

2021-08-13 00:16:30 61

原创 mysql 系列:存储引擎

介绍在上一篇文章 mysql 总体概述 里我们大概了解了 mysql 的架构设计,其中提到了存储引擎。它在 mysql 里是一个非常重要的角色,负责了数据的创建、读取和更新,也就是数据的 I/O 操作。最重要的是,它是可插拔的模块,这意味着我们在切换存储引擎时,对于上层应用来讲,是不需要做任何适配的。存储引擎有很多种,而且都有属于自己的特性,像我们常见的 InnoDB 有事务支持、MyISAM 速度较快等。存储引擎的用法作为插件化的模块,我们可以很自然的添加、卸载存储引擎,并且在创建表时指定存储引

2021-08-08 20:47:16 73

原创 mysql 系列:总体架构概述

前言使用 mysql 很多年了,但也没怎么深入研究过,准备最近了解下 mysql 的相关知识点。看看这款程序界里的神器是怎么运转的。mysql 的架构模式mysql 采用的是 C/S 架构,也就是我们平常所说的客户端-服务器模型。像我们平常所用的 workbench、nacivat 就是客户端,当然,还有命令行工具。它们会根据指定的 ip、prot 连到服务器,通过一定的协议来进行 SQL 的执行。这些协议包括最广泛使用的 TCP 协议,也包括了适用于本地通信的套接字、共享内存、命名管道等协议。m

2021-08-08 20:46:25 189

原创 这五年的6个编程感悟!

前言没接触编程之前,总觉得它很神秘,很牛逼。每当有新的系统,新的软件出来时,总想冲在前头,然后 down 下来好好体验。后来加入了程序员大军,才发现编程并非想象中的那么美好,经常要面对完成不了的需求,和背不完的锅,真的是一部辛酸编码史。尽管如此,我们的工作也算是在为机器注入灵魂,还是挺高大上的。只是很多时候不得不面对一些残酷现实,下面就来聊一聊这几年的编程感悟吧!1、 bug 是修不完的不知各位猿友有没有这样的体会:每当周五临近下班时,测试总会向你扔来一大堆的 bug 工单。而就在你以为所有的

2021-08-05 23:38:14 273

原创 golang 重要知识:context 详解

在很多的 Go 开源框架里,我们经常能看到 context 的身影,它的使用场景有很多,像超时通知,取消通知都能用到 context。今天我们就来好好的认识一下它,看看 context 的相关知识和底层原理

2021-07-15 07:35:33 805

原创 golang 重要知识:atomic 原子操作

原子操作:Add、CompareAndSwap、Load、Store、Swap

2021-07-14 23:17:32 5063

原创 golang 重要知识:sync.Cond 机制

golang 同步机制 sync.Cond:可同步等待,单播唤起,广播唤起

2021-07-13 23:43:08 389

原创 golang 重要知识:sync.Once 讲解

sync.Once 介绍及源码分析

2021-07-13 20:41:06 163

原创 golang 重要知识:waitgroup 解析

Golang 提供了简洁的 go 关键字来让开发者更容易的进行并发编程,同时也提供了 WaitGroup 对象来辅助并发控制。今天我们就来分析下 WaitGroup 的使用方法,顺便瞧一瞧它的底层源码

2021-07-10 13:21:47 1592 1

原创 golang 重要知识:定时器 timer

在 Go 里有很多种定时器的使用方法,像常规的 Timer、Ticker 对象,以及经常会看到的 time.After(d Duration) 和 time.Sleep(d Duration) 方法,今天将会介绍它们的使用方法以及会对它们的底层源码进行分析,以便于在更好的场景中使用定时器。

2021-07-08 23:32:39 1352

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除