Redis线程模型
redis 内部使用文件事件处理器 file event handler,它是单线程的,所以redis才叫做单线程模型。它采用IO多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。
文件事件处理器的结构:
多个 socket
IO 多路复用程序
文件事件分派器
事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
线程模型多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO多路复用程序会监听多个 socket,会将产生事件的 socket 放入队列中排队,事件分派器每次从队列中取出一个 socket,根据 socket 的事件类型交给对应的事件处理器进行处理。
一次客户端与redis的完整通信过程深入学习redis 的线程模型一、redis 的线程模型#
redis 内部使用文件事件处理器 file event handler,它是单线程的,所以redis才叫做单线程模型。它采用IO多路复用机制同时监听多个 ...
Prometheus 是云原生计算基金会的一个项目,是一个系统和服务监控系统。它收集指标 从给定时间间隔的配置目标中,评估规则表达式, 显示结果,并可在观察到指定条件时触发警报。
Prometheus 与其他指标和监控系统的区别在于:
多维数据模型(由指标名称和键/值维度集定义的时间序列)
PromQL,一种强大而灵活的查询语言,用于利用此维度
不依赖分布式存储;单服务器节点是自治的
用于时序集合的 HTTP 拉取模型
支持通过中间网关推送批处理作业的时序
通过服务发现或静态配置****发现目标
支持多种绘图和仪表板模式
支持分层和水平联合
prometheus简单的使用
快速使用尝试首先保存如下配置prometheus.yml文件
global: scrape_interval: 15s # 默认情况下,每 15s 采集一次目标数据 # 与外部系统(如 federation, remote storage, Alertmanager)通信时,可以将这些标签应用到到和时间序列或告警上 external_labels: monitor: ...
记录Docker的一些应用
如何编写Dockerfile文件部署go项目
对于项目而言,我们要将所有项目编排在容器中,一般容器与容器之间的交互可以通过ip,但是比较麻烦,所以,这里推荐使用docker的network,将所有容器都存放在一个网络中,这样子容器之间的通信就相对比较容易。
如何创建网络,使用命令
docker network create networkName
使用docker network connect连接到创建的网络
docker network connect networkName dockerName
我们可以通过以下命令查看该网络下的连接
docker network inspect networkName
通过网络就可以使用容器命进行通信了
已经将我们要的容器添加至同一network中后,就可以开始编写我们的dockerfile了。
Dockerfile操作指令如下
指令 含义FROM 镜像 ...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
今日设计模式——责任链模式
责任链模式
责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
模型说明
Handler:声明了所有具体处理者的通用接口。该接口通常仅包含单个方法用于请求处理,但有时其还包含一个设置链上下个处理者的方法。
BaseHandler:是一个可选的类,你可以将所有处理者共用的样本代码放置在其中。
通常情况下,该类中定义了一个保存对于下个处理者引用的成员变量。客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。该类还可以实现默认的处理行为:确定下个处理者存在后再将请求传递给它。
ConcreteHandlers:包含处理请求的实际代码。每个处理者接收到请求后,都必须决定是否进行处理,以及是否沿着链传递请求。
...
认证授权基础概念详解
认证和授权的区别是什么?这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。
说简单点就是:
认证 (Authentication): 你是谁。
授权 (Authorization): 你有权限干什么。
稍微正式点(啰嗦点)的说法就是:
Authentication(认证) 是验证您的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
Authorization(授权) 发生在 Authentication(认证) 之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如 admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。
认证:
授权:
这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。
R ...
Introduction
任何看到显著增长的应用程序或网站,最终都需要进行扩展,以适应流量的增加。以确保数据安全性和完整性的方式进行扩展,对于数据驱动的应用程序和网站来说十分重要。人们可能很难预测某个网站或应用程序的流行程度,也很难预测这种流行程度会持续多久,这就是为什么有些机构选择“可动态扩展的”数据库架构的原因。
“可动态扩展的”数据库架构:分片数据库。近年来,分片(Sharding)一直受到很多关注,但许多人并没有清楚地了解它是什么,或者对数据库进行分片可能有意义的场景。我们将讨论分片是什么,它的一些主要优点和缺点,以及一些常见的分片方法。
What is Sharding? 什么是分片?分片(Sharding)是一种与水平切分(horizontal partitioning)相关的数据库架构模式——将一个表里面的行,分成多个不同的表的做法(称为分区)。每个区都具有相同的模式和列,但每个表有完全不同的行。同样,每个分区中保存的数据都是唯一的,并且与其他分区中保存的数据无关。
从水平切分(horizontal partitioning)与垂直切分(vertical parti ...
接口性能测试与调优相关一直是属于无经验状态。思考提升自己的能力,是否要学会压力测试?
JMeter
Apache JMeter 是一种Java框架,用于各种负载测试,性能测试和功能测试。
注意:测试容易受到网络抖动的干扰,服务器硬件配置环境影响;因此压力测试一般情况下,都应该在内网进行,不在外网去测试;
官网:https://jmeter.apache.org/教程:Apache JMeter - User’s Manual
镜像下载地址:Apache JMeter - Apache JMeter™
windows可以使用图形化界面进行测试,linux建议使用命令模式进行测试。但是为了测试的便捷性,我们使用jmeter的图形化界面进行压力测试。
下载完成后可以尝试给JMeter配置一下环境变量
运行:点击 jmeter.bat 即可
打开后:
配置中文
使用JMeter对成程序接口进行测试首先如下程序,我们会进行一秒种的睡眠
package mainimport ( "github.com/gin-gonic/gin" "net/ ...
分布式追踪系统
Jaeger
Jaeger 受到Dapper和OpenZipkin的启发,是由Uber Technologies创建 。
可用于监控基于微服务的分布式系统:
分布式上下文传播
分布式事务监控
根本原因分析
服务依赖分析
性能/延迟优化
入门使用采用dcoker启动
docker run --rm --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 4317:4317 \ -p 4318:4318 \ -p 14250:14250 \ -p 14268:14268 \ -p 14269:14269 \ -p 9411:9411 \ jaegertracing/all-in-one:1.53
windows上启动时:
docker run -d --name 12306-jaeger ` --network go-zero- ...
系统监控
很多系统中都有守护进程,它们能够在后台监控系统的运行状态,在出现意外情况时及时响应。系统监控是 Go 语言运行时的重要组成部分,它会每隔一段时间检查 Go 语言运行时,确保程序没有进入异常状态。本节会介绍 Go 语言系统监控的设计与实现原理,包括它的启动、执行过程以及主要职责。
设计原理
在支持多任务的操作系统中,守护进程是在后台运行的计算机程序,它不会由用户直接操作,它一般会在操作系统启动时自动运行。Kubernetes 的 DaemonSet 和 Go 语言的系统监控都使用类似设计提供一些通用的功能:
守护进程是很有效的设计,它在整个系统的生命周期中都会存在,会随着系统的启动而启动,系统的结束而结束。在操作系统和 Kubernetes 中,我们经常会将数据库服务、日志服务以及监控服务等进程作为守护进程运行。
Go 语言的系统监控也起到了很重要的作用,它在内部启动了一个不会中止的循环,在循环的内部会轮询网络、抢占长期运行或者处于系统调用的 Goroutine 以及触发垃圾回收,通过这些行为,它能够让系统的运行状态变得更健康。
监控循环当 Go 语言程序启动时,运 ...
由于在项目中对于时间的处理总是能看到不同的处理方式,Java中和go中都有不同的处理方式。每个人对于时间的处理方式也尽相同,主要记录go中对于时间的处理方式。
go在web项目中的时间处理
关于我在项目中看到的对于时间的表示在gin项目中使用gorm的时候
gorm中主要使用time.Time来表示时间和计算
在go-zero-looklook中
使用 int64–>转换成time.Time
go中时间处理常用方法时间的表示
Go 语言中时间的表示方式是通过 time.Time 结构体来表示的。time.Time 类型代表了一个时刻,它包含了年月日时分秒和纳秒等信息。
我们可以使用 time.Now() 函数获取当前时间,或者使用 time.Date() 函数创建一个指定的时间。
package mainimport ( "fmt" "time")func main() { fmt.Println("hello world") // 获取当前时间 t1 := time.Now() fmt ...