Uncategorized

为什么要从php迁移到go

为什么要从php迁移到go 今天约到一个公司面试,聊到他们公司正在从php语言迁移到go语言,我就想知道他们为什么要迁移到go语言,有什么优势吗? 他们的回答是: 1. go语言是一种编译型语言,编译后直接运行在操作系统上,没有解释器的 overhead,所以性能要比 php 高很多。 2. go语言天生支持并发,通过 goroutine 和 channel 可以很方便地实现并发编程,而 php 原生要实现并发编程比较繁琐。 for example: 在实际使用场景下: php在需要进行大量数据计算和数据清洗的场景下,原生php只能顺序执行,在遇到计算体量比较大的场景下,如果顺序执行的时间成本比较高,比如要计算10个模块的子数据块的金额数据,一个数据块需要500ms 10个数据块则是5000ms go在进行大量数据计算和数据清洗的场景下,通过 goroutine 和 channel 可以很方便地实现并发编程,每个数据块可以分配一个 goroutine 来并行计算,最后通过 channel 来合并结果,这样可以大大提高计算效率,减少时间成本。同样的计算场景下10个子模块的数据可以将10个子模块的数据计算叠加到一起进行并发计算,计算需要的时间则是10个子模块数据计算中计算时间最长的单元的时间成本,相比于10个模块时间成本的和计算的时间成本是指数级的提高。 3. go语言的学习成本和php的swoole型框架的学习成本比较,底层知识的学习成本是一样,相近的,在相同学习成本的场景下,go语言普适性更高,性能更好,社区支持更长久,第三方框架和语言功能适配性会更好 4. go语言生成的二进制包能更好的迁移和服务器扩容

架构设计

本地消息表简介

本地消息表简介 本地消息表是分布式事务的一种实现方式,解决了分布式场景下数据最终一致性问题,是分布式事务相对简单可靠的解决方案,有一定的数据延迟性 实现思路 例:如在支付场景中,当用户支付完订单后, 订单服务会向本地消息表插入一条消息,消息内容为订单支付成功 订单服务会向支付服务发送一条消息,消息内容为订单支付成功 订单支付的业务逻辑和本地消息表的写入,生成订单相关业务逻辑和数据,订单的异步MQ任务投递是在同一个事务中,其属性是原子的 订单的异步MQ任务会被需要的服务消费,消费后的结果会更新本地消息表的状态 本地消息表会定时扫描,将状态为未处理的消息重新投递到MQ中 其他服务在需要查询订单状态时,会先查询本地消息表,若状态为已处理,则直接返回结果,否则向订单服务查询 并且需要一个定时扫描程序定期扫描本地消息表,检查检索没有正确投递,或者下游服务没有正确应答的消息,将其重新投递到MQ中 需要注意的是重新投递的MQ任务也可能会投递、消费失败,则需要在本地消息表中记录重试次数,超过最大重试次数则需要人工处理,注意在所有下游服务拉去MQ时的消息记录和日志需要完整,并且记录下每次消费的结果(正确或异常),方便后续分析和处理 问题 MQ服务,和其他服务在交互环节中会有数据不一致,延迟,消息丢失,服务挂机的情况发生,有服务宕机,消息丢失,进程消费异常等情况是会经常发生出现的,如何解决该问题 需要通过生成全局消息表traceId的方式完善该问题的逻辑,全局消息表是全局唯一,并且幂等,如果有消息丢失进程挂起,假死等情况需要将全局的本地消息表记录中的mq数据重复投递, 在其他分布式服务中需要幂等该进程的traceId的幂等消费,多次投递多次消费的结果是一致的 本地消息表是和业务逻辑相对耦合的,如果业务逻辑发生变化,需要同步修改本地消息表的处理逻辑,否则会导致数据不一致的问题,所以该实现方式对业务侵入性较强,不适合处理通用性较强的场景,所以使用时需要注意代码的后期维护几率和成本,如果后期维护成本较高,并且业务逻辑频繁变更,建议使用其他分布式事务实现方式 https://www.ierchina.com

架构设计

访问微信公众号的网址非常慢(分析与优化方案)

访问微信公众号的网址非常慢(分析与优化方案) 问题场景 从公司站点或落地页跳转到微信公众号文章链接(如 mp.weixin.qq.com)时,整体打开耗时明显偏高 可能伴随多次重定向、接口串行校验、图片与第三方脚本阻塞加载等现象 关键现象与指标 DNS 解析耗时高、TLS 握手时间长、TTFB 偏高 重定向次数多(>1 次常见会显著拉长总耗时) 首屏阻塞资源过多(JS 同步加载、未压缩的图片、第三方埋点) 后端接口响应慢(数据库查询无索引、N+1、分页不当) 根因分析维度 链路与不可控边界 微信域名与其网络出口不可控,跨运营商/跨地区链路质量差异大 ICMP 常被屏蔽,Ping 不一定可用,需用 HTTP 侧指标判定 跳转逻辑与认证 过多的 302/301 重定向链、签名校验串行执行、未缓存的配置接口 跳转页存在动态渲染与接口依赖,导致首屏耗时增加 前端资源与页面结构 大体积图片、同步第三方脚本、阻塞式 CSS/JS、未启用缓存与压缩 服务端与网关 未开启 HTTP/2、KeepAlive 配置不合理、TLS 会话复用与 OCSP Stapling 缺失 数据库与存储 查询缺索引、Scan 过重、N+1 查询、分页深页、大量无用字段加载 诊断与定位步骤 浏览器侧 Chrome DevTools 网络面板:查看 DNS、TLS、TTFB、重定向链、阻塞资源瀑布图 Performance/Coverage:识别长任务与未使用代码 Lighthouse/WebPageTest:获取实验室指标与真实网络行为 命令行与网络 使用 curl 统计时延:curl

架构设计

在网页中 HTTP 访问一个网址发生了什么?

在网页中 HTTP 访问一个网址发生了什么? 简要流程 解析 URL 与安全预处理 DNS 解析(目标域名 IP) 建立连接(TCP/80 或 TCP/443;或 QUIC/UDP) TLS 握手(若为 HTTPS) 浏览器发起 HTTP 请求 服务器处理请求(反向代理/应用/数据库/缓存) 返回 HTTP 响应(状态码、响应头与内容) 浏览器解析与渲染页面 缓存与后续优化(前端/CDN/代理) 连接复用或关闭 环节 1. 地址栏输入与预处理 自动补全与安全检查:浏览器可能进行历史记录/书签匹配、恶意站点拦截、HTTPS 先行策略(HSTS)。 本地命中与拦截:Service Worker 有权拦截同源请求,命中离线缓存或走自定义网络策略。 2. 域名解析(DNS) 解析顺序:hosts 文件 浏览器/系统 DNS 缓存 本地域名解析器 递归/权威 DNS。 关键记录:A/AAAA(IPv4/IPv6)、CNAME(别名)。CDN 会返回最优边缘节点 IP(ECS/GeoDNS)。 安全与隐私:DoH/DoT(HTTPS/TLS 下的 DNS)、DNSSEC 验证。解析结果受 TTL 控制被缓存。 3.

Uncategorized

MySQL事务隔离级别

MySQL事务隔离级别 事务四大特性(ACID) 特性 说明 MySQL 实现方式 原子性 (Atomicity) 事务要么全部完成,要么全部不完成 Undo Log(回滚日志) 一致性 (Consistency) 事务前后数据完整性一致 业务逻辑 + 数据库约束 隔离性 (Isolation) 事务之间互不干扰 MVCC + 锁机制 持久性 (Durability) 事务提交后永久生效 Redo Log(重做日志) 四种隔离级别 1. READ UNCOMMITTED(读未提交) SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 特点: 可以读取其他事务未提交的数据 脏读、不可重复读、幻读 都可能发生 使用场景: 对数据一致性要求极低的场景 统计类查询(如 count(*),允许一定的数据偏差) 实际生产环境几乎不使用 示例: — 事务A BEGIN; UPDATE accounts SET

Uncategorized

HTTP 协议简介

HTTP 协议简介 Page 1 E2HyperText TraTsfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,F0mlth.616HTTP2cfr/atarr14年12月,互联网工程任务组(Ien超文本传输协议(英文:)的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。-enRFC文档ihttps://www.rfc-editor.org/rfc/inl 协议简介 1H。.1TTP 协议中现今广泛使用的一个版本——PTTH定义了 Page 2 HTTPRFC图解⽂档的定义请求格式 Page 3 HTTP请求格式 Page 4 HTTPRFC图解⽂档定义响应格式 Page 5 HTTP响应格式 Page 6 HTTP URI Page 7 w/Hostttp:可以部署多个h/wwww./index.htmltest2http://w.Host.test1.comco有些代理不接受⾃定义的mHTTP HeadersWEB站,根据请求头域说明了正在请求资源的⽹络主机和端⼝号,同⼀台服务器服务器收到了这两个请求,会根据oHst这个⾸⻚,在浏览器访问如下两个地址Host定位到正确的资源的资源,⽐如⼀台deraHestiltmh/iHndex.sto/ ndex.html Ho BWEstHo服务器部署了两个⽹站,都有字段来区分是请求哪个⽹是是tecoww..cost2mwwww.test1m. Page 8 ded-ForX-Forwarded-For格式如下:]X-Forwarded-For: client,”proxy1, proxy2R可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备

算法

水塘采样算法解决随机抽样需求

水塘采样算法解决随机抽样需求 需求场景: 如果我们现在有200万用户数据,需要从200万用户数据中以较好的随机性,随机抽取200个用户做案例分析或灰度发布; 尝试了多种算法,发现水塘采样算法是性能较好、随机性较好、算法空间复杂度平衡、比较适合泛用性需求场景; class ReservoirSampler { private $pdo; private $batchSize = 10000; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function sample($tableName, $k) { $reservoir = []; // 水塘,存储 k 个随机样本 $offset = 0; // 分页偏移量 $count = 0; // 已处理的元素总数 while (true) { // 分批读取数据,避免一次性加载所有数据 $sql = “SELECT * FROM {$tableName}

技术

Web UI 组件库 Layui 快速网站构建工具

Web UI 组件库 Layui 快速网站构建工具 Layui 是一套遵循原生态开发模式的 Web UI 组件库,采用自身轻量级模块化规范,易上手,可以更简单快速地构建网页界面。 这个工具特别适合非专业的前端开发人员,可以使用该 UI 工具快速构建基于模板渲染的前后端管理后台。 核心特点 该工具具有多种亮点和特色,以下是最值得关注的几个方面: 适用场景 github:

架构设计

服务器性能优化

服务器性能优化 在日常开发中如果需要进行服务器性能优化大概有哪些切入点,例客户端请求服务器一个业务接口,可以优化的对象有Linux,nginx,phpfpm,php,mysql,redis; linux 可以优化配置服务器可以连接的套接字文件进程数 /etc/sysctl.conf # 系统最大文件句柄数(所有进程可打开的文件总数上限) fs.file-max = 1000000 # 系统范围内已分配、未使用的文件句柄数(监控用,一般不直接设置) # fs.file-nr # 端口范围 net.ipv4.ip_local_port_range = 1024 65535 # TCP连接相关 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 50000 # TIME-WAIT优化(高并发场景) net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_tw_buckets = 2000000 net.ipv4.tcp_fin_timeout = 30 nginx # ============ 全局配置部分 ============ user nginx; # 确保与系统用户一致 worker_processes auto; # 自动设置为CPU核心数

RaspberryPi

RaspberryPi 在家庭的使用

RaspberryPi 在家庭的使用 树莓派在家庭使用有很多场景和功能,我在本地使用树莓派有几个有趣的应用方式 – 本地配置 ssh 跳板机 “本地可以配置 ssh 登录跳板机,远程连接服务器,则不需要在多太服务器中配置公钥,家里的所有电脑只需要连接到 pi 中则可以直接请求连接服务器,如果你家中有超过 3 台工作电脑,则是非常有效的的应用场景 “ – 本地配置流量代理 “本地配置clash做流量转发,pi中配置openvpn代理,将转发的流量发送到服务器,则本地局域网中可以实现所有电子设备都可以使用 pi 进行软路由代理 “ – 本地配置 smbd 服务 “本地配置 smbd 服务,本地mount两块闲置的硬盘,则可以在局域网中实现本地网盘,如果您有多台工作电脑和设备之间需要数据传输和共享,则可以通过 smbd 服务进行数据同步,实际本地使用非常方便,可以节省很多不必要的数据亢余 “ – 本地配置aria2c 做本地下载机 “如果你需要本地下载一些大文件,和影音文件,aria2c+本地挂载磁盘 是一个不错的选择,直接使用命令行实现 24 小时不间断下载文件数据,下载后存储在本地挂载磁盘中 “

Scroll to Top