编辑
2025-09-28
编程技巧
00

在基于 Docker Compose 的多容器应用部署中,一个常见的挑战是管理服务之间的启动依赖关系。

应用容器的启动速度往往快于数据库等后端服务,若应用在启动时无法连接到尚未就绪的依赖服务,将导致连接失败和容器异常退出。

使用 wait-for-it.sh 这一轻量级 Shell 脚本,可以确保服务依赖项完全可用后,主应用再执行其启动命令,从而提高容器化应用部署的健壮性。

1. 问题陈述:服务启动的依赖性

docker-compose.yml 文件中,虽然可以使用 depends_on 来控制容器的启动顺序,但 depends_on 仅能保证依赖容器的启动,而无法保证容器内部的服务(例如数据库进程)已经完成初始化并准备好接受外部连接。

这种时间差会导致竞态条件(Race Condition):

  • db 服务的容器已启动,但其内部的数据库进程仍在初始化。
  • app 服务的容器已启动,并立即尝试连接数据库。
  • 由于数据库尚未就绪,连接失败,导致 app 服务崩溃或进入不断重启的循环。

为了解决这一问题,我们需要一种机制来探测依赖服务的端口是否可用,从而精确控制主应用进程的启动时机。

编辑
2025-09-28
Python
00

1. 问题现象与触发场景

在基于 RabbitMQ 的任务队列系统中,开发者可能会出现以下一种或多种异常现象:

  • 核心现象: -任务重复执行 一个本应只执行一次的长时任务,在成功执行后,被另一个消费者(Worker)再次获取并执行。

  • 关联日志表现

    • 业务逻辑: 从业务日志看,第一个 Worker 可能已经完整地执行了所有业务逻辑。
  • 系统级影响

    • 资源浪费: 重复执行无谓地消耗了 CPU、内存和 I/O 资源。
    • 数据一致性破坏: 对于非幂等任务(如“给用户账户增加100元”),重复执行将直接导致数据状态错误。
    • 外部系统调用混乱: 重复向用户发送邮件、短信,或重复调用第三方支付接口。

典型触发场景:

此问题专属于执行时间超过特定阈值(默认为 15 或 30 分钟)的任务。常见场景包括:

  • 数据密集型处理: 生成复杂的财务报表、执行大规模数据清洗或 ETL 流程。
  • 媒体处理: 视频转码、高清图片处理、音频分析等。
  • 机器学习任务: 模型训练或批处理推理。
  • 长时间等待的 I/O 操作: 调用一个响应缓慢的第三方 API、等待大文件在不同系统间传输完成。

编辑
2025-08-29
安装与配置
00

系统准备

系统软件源镜像配置

本次我的机器使用的是Centos,所以软件源需要切换到vault软件源

sudo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* sudo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

更新系统并安装基本工具

可根据各自的系统安装以下内容

bash
sudo dnf update -y sudo dnf install -y epel-release sudo dnf install -y wget git gcc kernel-devel-$(uname -r) kernel-headers-$(uname -r)

epel-release: 提供额外的软件包。
gcc, kernel-devel, kernel-headers: 这些是编译 NVIDIA 驱动所必需的。$(uname -r) 会确保安装与你当前运行的内核版本匹配的头文件。

编辑
2025-08-18
安装与配置
00

一、 webdav 和网盘的关系

WebDAV不是又一个新的网盘服务,而是一种经典、开放且强大的技术协议

只要是存储系统,都可以使用 webdav 作为标准访问接口,让任何支持 webdav 的客户端访问存储系统。

它就像一把神奇的钥匙,能让你将家里的电脑、NAS 或任何一台服务器,变成一个完全由你掌控的、跨平台的“私人数据中心”。

编辑
2025-08-01
Python
00

Gunicorn 使用及常见工程化配置

1. 什么是 Gunicorn?

Gunicorn 是一个用 Python 编写的轻量级 WSGI 服务器,遵循 UNIX 风格,兼容多种 Web 框架,如 Django、Flask 等。它通过多进程和多线程方式处理 HTTP 请求,具有简单易用、高效稳定的特点。

主要特点:

  • 支持多种工作模式(同步、异步)。
  • 易于配置和扩展。
  • 与许多 Web 框架兼容。
  • 适合在生产环境中部署 Python 应用。