• 把宿主的程序和依赖动态库挂载进docker容器,解决一个诡异BUG

    今天在一台 Redhat 7 服务器上启动一个 Kafka 3.7.2 容器,遇到一个很诡异的报错。经过排查发现,问题是由容器里新版 bash 引起的,应该是新 bash 或动态库可能跟老内核不兼容。

    最终,我们把宿主上的旧版 bash 及其依赖动态库挂载到容器上解决问题。整个问题排查过程和解决思路挺有意思的,涉及不少基础知识,分享给大家。

    报错背景

    Kafka 容器启动方式平白无奇:

    1
    
    docker run --rm -it apache/kafka:3.7.2
    
    阅读全文
  • macOS上用Podman替代Docker Destop

    前不久在单位收到一封邮件,要求卸载Docker Destop,因为它是商业软件,厂里已经收到维权函。

    查了一下发现,好家伙,这确实是一个商业软件。以前以为它是开源的,有点披着羊皮的狼的意思……根据条款,超过250人的企业就需要买 license(AI回答未经求证),有点把韭菜养肥了割的意思啊。碍于尚未找替代品,项目活又多,就拖到今天。

    本来对Docker Destop也没什么好感,docker 本来就是一些命令行工具,搞个 GUI 有什么鸟用呢?实际上,平时也都是在命令行下操作。本来想看看能不能用 brew 装一下命令行工具部分,结果发现好像只有一些 cli 工具,不包含引擎也用不起来,遂作罢。

    AI告诉我说 Docker Destop 有几个替代品,大致看了一下,剩下 ColimaPodman 两个 PK :

    Colima Podman
    原理 使用轻量级虚拟机,虚拟机运行docker 使用轻量级虚拟机,虚拟机运行一个无守护进程的容器运行时
    优势 跟docker一样,配置方便,上手难度低 性能较好,虚拟机性能损耗较小,安全性也有优势
    劣势 性能损耗较大 虽兼容docker,但有些行为可能不太一样,需要懂点docker底层原理
    阅读全文
  • 排查邮件标题乱码问题,竟发现企业微信BUG!

    今早有用户反馈一个问题:系统发送的公告邮件,在企微客户端打开标题有乱码。我们查了一下各个客户端,邮件系统 Web 端打开是正常的,PC 客户端也是正常的,企微的 PC 客户端也是正常的。因此,问题被归结为客户端兼容性问题,按惯例大概是不了了之。

    虽然企微平时问题不少,但作为工作IM,重度使用。按照企微以前的尿性,问题修复很慢很慢的。因此,就算问题不是出在自己系统上,还是想看看到底为什么,能否绕过去。

    阅读全文
  • openssh弃用rsa算法,登录验证失败怎么办?

    ssh

    今天升级了 macOS 系统到最新版本,按苹果的尿性我有得重装 xcode ……毫不意外,系统起来后 gomakegit 等等一堆命令都跪了。由于一直被坑,早已形成条件反射,直接执行 xcode 更新命令就是了:

    1
    
    xcode-select --install
    

    xcode 安装完毕后,一切似乎恢复正常,直到我执行 git 命令拉代码:

    1
    2
    3
    
    $ git pull
    git@github.com: Permission denied (publickey).
    fatal: Could not read from remote repository.
    

    提示表明,SSH 公钥认证没通过,可我没换过密钥呀!

    怀疑跟升级有关,执行 ssh 命令,开启提示信息定位错误:

    1
    2
    3
    4
    
    $ ssh -vT git@github.com
    ...
    debug1: send_pubkey_test: no mutual signature algorithm
    ...
    
    阅读全文
  • 无聊玩玩WebAssembly,用Go语言写个应用

    WebAssembly 是一种基于栈的虚拟机二进制指令格式,缩写为 WasmWasm 被设计成一种可移植的编译目标产出物,支持 Web 部署,客户端和服务端均可。

    简言之,Wasm 是一种通用的虚拟机指令格式。任何平台只要实现了虚拟机,即可执行 Wasm 应用。工程师可以使用任何编程语言来发应用程序,只要最终能编译成 Wasm 即可。

    因此,Wasm 是一个威力强大的中间层,让开发语言与执行平台完全解耦,可以任意组合。Wasm 可以跑在浏览器上,也可以直接跑在操作系统里面(比如 LinuxWindows )。硬件平台当然也不挑,ARMx86 都可以。

    阅读全文
  • 今年双十一我又奢侈了一把!

    已经很多年对双十一无感了,但今年刚好看到别人推荐一个很赞的显示器,又奢侈了一把,哈哈~

    废话不多说,直接上图!

    阅读全文
  • 万字长文漫谈高并发技术

    互联网应用通常面向海量用户,其后台系统必须支撑高并发请求。在后端开发面试中,高并发技术也是一个常见的考察点。那么,高并发系统通常是怎么设计的呢?需要采用哪些技术呢?本文就简单聊一聊高并发背后的各种技术栈。

    必须明确高并发本身是目的,而不是某一项技术;只要能够提高连接数或系统处理吞吐的技术都算。因此,这是一个涉及面非常广的话题,本文无法事无巨细地展开。

    我会重点罗列实现高并发的常见技术栈,并简单介绍每种技术的工作原理和应用场景,帮大家快速建立整体的知识脉络。虽然每种技术的讲解篇幅有限,但我会列出更详细的学习资料,方便查阅学习。

    大家可以以此知识地图为指引,制定学习计划,查漏补缺。

    阅读全文
  • 用expect实现交互式命令自动对话

    expect 是一个自动对话命令,可以编程实现与交互式命令的对话交互。

    交互式命令

    想要学习 expect 命令,掌握它的典型应用场景,我们需要先弄清楚:什么是交互式命令?

    Linux 系统中,绝大部分命令都是非交互式的常规命令。非交互式的命令一旦提交执行,它便默默地干活,执行完毕后输出结果。举个例子,我们执行 uname 命令,回车按下后不用再做任何输入:

    1
    2
    
    $ uname
    Linux
    

    uname 命令用于查看操作系统信息,例子输出表明这是一个 Linux 系统。

    交互式命令,顾名思义在命令执行期间,可能需要跟用户进行交互。举个例子,我们执行 apt 命令安装软件包,该命令询问是否继续,用户要输入 Y 之后它才会继续安装:

    阅读全文
  • 如何在MongoDB上实现转账事务

    4.0 版本之前,MongoDB 是不支持事务的,只能由应用程序自行保证事务性。本文以银行转账为例,讲解如何在不支持事务的 MongoDB 上实现转账事务。

    转账场景

    客户账上余额由 accounts 表保存,表结构大致如下:

    1
    2
    
    {"_id": "A", "balance": 100} // 客户A账上有100元
    {"_id": "B", "balance": 100} // 客户B账上有100

    如果客户 A 发起一笔转账,转 10 元给 B ,那么余额表应该是这样的(假设没有其他操作):

    1
    2
    
    {"_id": "A", "balance": 90} // 客户A账上有90元
    {"_id": "B", "balance": 110} // 客户B账上有110

    由于转账需要同时修改两条账户记录,为保证数据一致性,我们必须保证:它们要么全都修改成功,要么全都保持初始原因,不能有中间状态。

    这就是转账操作的事务性要求,那么我们应该如何实现这一点呢?

    阅读全文
  • Blob对象应用实战

    背景

    Blob 对象是 二进制大型对象binary large object )的简称,顾名思义用来表示二进制数据内容。Blob 对象数据可以按文本或二进制格式进行读取,而且是不可变的。

    数据可以来源于文件,因此 Blob 可以用来读写文件,比如读写一个图片文件的内容。操作文件通常采用 File 对象,File 继承了 Blob 的数据读写功能,并在此基础上扩展实现文件系统相关功能。

    本文先讲解 Blob 对象相关接口,再讲解一些典型应用场景,最终彻底掌握 Blob 对象用法。

    阅读全文