一致性事务:从 2PC 到 Outbox pattern
"如果你做过一点微服务开发,大概率都遇到过这种场景:
"如果你做过一点微服务开发,大概率都遇到过这种场景:
在做移动应用开发时,不管是 Android 还是 iOS,我们都绕不开“签名”这件事。最近我们项目在筹备适配 HarmonyOS NEXT(鸿蒙 Next) 的 SDK,也顺势把鸿蒙的签名机制研究了一遍。这篇文章来分享下。
"在我们的后端架构中,我们采用了以游戏为租户单位的多租户数据库设计。所有游戏共享同一套数据库 schema,每张表通过 game_id 字段进行逻辑隔离。这种设计在初期带来了显著的开发与维护效率,支持我们快速迭代、快速上线多个游戏项目。
春节假期,我终于完成了两件大事:见了未来的岳父岳母,还带奶奶游览了北京。忙里偷闲,我决定总结一下这几天的经历,顺便分享一些“花钱”与“省钱”的小感悟。
在 Golang 网络请求中,我们经常会遇到两种常见的错误:`EOF` 和 `read: connection reset by peer`。这两个错误虽然看似相似,但实际上有着本质的区别。这篇文章将深入探讨这两种错误的原因、区别以及如何优雅的处理它们。
在 Go 语言中,context 包提供了一种跨 API 和进程边界传递请求作用域值、取消信号以及超时信号的方式。使用 context 可以帮助我们更好地控制 goroutine,避免 goroutine 泄漏等问题。出现 "context deadline exceeded" 错误通常是因为在请求上下文中设置了超时时间,但请求在超时时间内未完成。我们应该尽量避免这种错误...
我们团队负责的防沉迷上报服务突然在某一天遭遇了内存溢出(OOM)的情况。通过查看 Prometheus 监控数据,我们发现 Goroutines 的数量在中午十二点之后呈现出线性增长趋势,直至晚上十点 OOM 发生,Goroutines 数量骤降为零。
"在使用 gorm 处理数据库操作时,尤其是针对 MySQL,有时我们会遇到 golang 标准库`errors.Is`函数无法直接识别特定的 gorm 错误类型的情况,如主键冲突错误。尽管 gorm 提供了`gorm.ErrDuplicatedKey`来表示此类错误,但在原始错误返回中并不能直接通过`errors.Is(err, gorm.ErrDuplicatedKey)`来进行判断。本文深入探究 gorm.io/driver/mysql 包中的错误转换机制,揭示了如何借助`error_translator`模块将 MySQL 的错误码映射为 gorm 的错误类型。
"Tunnel 可以做什么?
2023年,对我来说是充满购物冒险的一年,我购买了很多东西,今天,我想回顾一下,分享哪些购买对我来说物超所值,哪些则是我冲动消费的产物,让我感到后悔。让我们开始这段回忆旅程吧~??️
在现代 Web 应用中,服务端与客户端之间的高效通信至关重要。本文探讨了四种主流的服务端通信方法:短轮询、WebSocket、SSE(Server-Sent Events)和长轮询,分析它们的工作原理、适用场景及优缺点。
在谈论 API 设计和开发时,有时,一个属性可以是多种类型中的一个,但不能同时是多种类型。比如支付接口的回调处理,常常为了兼容不同平台的参数,会使用以下方式中的一种来进行接收,在程序开发中,我们往往会采用主流的 HTTP 协议和 gRPC 协议进行通信,两种技术都为开发者提供了强大的工具来描述、验证和生成 API,但它们的方法和原则有所不同。
随着现代软件开发的持续迭代,团队间的协作变得越来越重要。为了确保整个团队在编码、构建和部署过程中的效率和质量,引入一些特定的配置文件和标准工作流程显得尤为关键。以下就是一些在团队开发中常见而又重要的文件,我总结了它们的一些作用和优点。
在今年7月份左右,我开始关注自行车,出于便携性而言,我更倾向于购买一辆折叠车,之前在大街上也看到了很多骑得超快的折叠车,所以我对于折叠车的竞速性能也是满意的,于是我开始看各种折叠车的测评和论坛~
Cloudflare R2 是一款高性能、低成本的对象存储服务。之前在使用 OSS 的时候,用惯了 OSS brewer, 在用 R2 时候发现,开始没有找到合适的 brewer 工具,而网页端上传会限制文件数量和大小,就尝试用命令行的 client 了哈哈, 使用之后发现,确实好用,相比使用网页管理对象存储,利用命令行工具可以大大提高管理效率,特别适合需要批量操作或脚本化的场景。
"GORM 中SQL、慢SQL打印日志传递 trace ID, 重写GORM日志实现,SQL日志、慢日志请求追踪
"写博客一个很重要的东西就是图床, 如果没有一个合适的图床来安全稳定地存储数据,指不定哪天,你的文章就到处都是
"使用kratos这个框架有近一年了,最近了解了一下kratos关于程序优雅退出的具体实现。
在程序进行重启等操作时,我们需要让程序完成一些重要的任务之后,优雅地退出,Golang为我们提供了signal包,实现信号处理机制,允许Go 程序与传入的信号进行交互。
"最近我发现了一个非常有趣的国外MySQL Serverless平台,它叫做PlanetScale。这个平台不仅仅是一个数据库,它能像代码一样轻松地创建开发和测试环境。你可以从主库中拉出一个与之完全相同结构的development或staging数据库,并在这个环境中进行开发和测试。所有的数据都是隔离的,不会相互干扰。
先前,我的 RSS 订阅功能过于简化,只提供了几个基本字段,而且不展示全文。我决定对订阅功能做一次全面的改进。
运动数据使用GitHub Action自动更新| 开通体验了一下GPT Plus | 买了一支录音笔,全天候录音,使用 whisper 录音转文字 |终于注册了 V2EX |GPT API续费问题曲线救国|报名了PMP的培训班和考试
职业道路上的新旅程:一个游戏开发者的自我介绍
"如果你想把你的运动数据和热力图同步到 GitHub,那么你来对地方了。在这篇文章中,我将详细解释如何使用 GitHub Actions 和 Python 自动同步和更新你的数据。
在我最近使用Gorm进行字段更新的过程中,我遇到了一个问题。当我尝试更新status字段时,即使该字段的值没有发生变化,Gorm还是提示我“Duplicate entry 'xxxx' for key 'PRIMARY'”。
"5月31日晚,我们接到游戏玩家反馈,经常出现请求超时的提示。在我亲自登录游戏验证后,也出现了相同的错误,但游戏仍然可以正常运行,数据也没有任何问题。
"敏捷开发中有一个广为人知的开发方法就是 XP(极限编程),XP 提倡测试先行,为了将以后出现 bug 的几率降到最低,这一点与近些年流行的 TDD(测试驱动开发)有异曲同工之处。
"最近在GitHub上面发现了一个[很有趣的开源应用](https://github.com/tw93/Pake),可以将网页打包成应用
之前看到很多大佬的 Blog 是部署在 Github 上面的,但因为自己目前的博客是带后端的,所以就没有考虑。很久之前看到 @yihong 的心跳和跑步,感觉挺不错的,但因为自己没有跑步的习惯,就感觉不是很感冒 ???? 直到最近在听零机一动的时候,又听到了 yihong 的跑步, 我突然想到,我应该也可以把我的游泳 骑车 有氧也像 @yihong 的跑步数据一样上传过来。那么第一件事,我需要了解一下 GitHub Action 的机制,小小地尝试一下。
"之前刷推看到了不少人发软路由,最近又看到a姐发了一句:全推入手软路由了
Clash 是一款开源的网络代理工具,可以帮助用户实现对网络流量的控制和管理。我使用了很久,但苦于每次访问国内外网络需要手动开关代理,于是我就问了下GPT, 还真就解决了。
如何使用 ssh 将本地服务代理给外部访问并保持 SSH 会话的连接性
"最近,我接触了很多关于AI技术的东西。例如ChatGPT、NewBing、ChatGPT更快的API、stable diffusion、AI语音识别等等。这些技术让我惊喜,也让我感到焦虑。
最近在推特上看到很多人在谈论New Bing申请的事情,我也收到了试用通过的邮件。于是我马上打开Edge浏览器体验了一下。
分享一些平时遇到的有趣的开源项目
公司的某款游戏在1月初接入微软小冰AI聊天功能。为了保存聊天记录并为后续的统计功能做好准备,决定将聊天记录存放在服务端。
在google设置静态页面 CDN加速
我平时一直都在发现很多优质的资源,但都没有整理。一直增加,单独一个页面可能开始会有些乱,就先开一篇放在这里。
"今天在使用ecs进行部署网页时,出现了一个问题。使用nginx代理到页面index.html路径下,同路径的资源都可以加载到,但是却无法正确加载到页面样式。打开f12,网络和控制台都没有资源异常,但页面乱成了一锅粥。
大学毕业以后,买了一台乞丐版的13寸的macbook pro(8 + 128 这个配置可能还不如现在的安卓手机),今年年中,我开始把工作用的macbook pro(18款 15寸 16 + 256)往家里带,勉强够用。到了今年下半年,我渐渐感觉,这俩电脑,一个能打的都没有,真顶不住了。
最近将域名迁到了google domain,就研究了一下Let’s Encrypt的域名证书配置。发现网上找到的教程在官方说明中已经废弃,所以自己写一个流程记录一下。
"五人墓碑记 明 张溥
效能,效就是结果,能就是取效所做的功。
阿里服务器被ban了,数据全没了