0%

什么是消息队列

消息队列是在消息传输过程中保存消息的容器。 通常有生产者和消费者两个角色:

  • 生产者只负责发送数据到消息队列,谁消费他不管
  • 消费者只负责从消息队列中取数据处理,谁发送数据他不管

常见消息队列中间件

  • Kafka 高吞吐量, 实时日志采集
  • RabbitMQ Erlang语言, 灵活性和易用性,中小规模应用
  • RocketMQ 阿里出品, Java开发, 国内市场有很高知名度和应用案例

为什么使用消息队列

阅读全文 »

前言

Linux安装RabbitMQ
官方教程

1. Hello RabbitMQ

使用Python pika客户端, 写一个简单的生产者和消费者

1
Producer ------> Queue -----> Consumer

编写Producer(send.py)

先连接Broker, 建立connection和channel

1
2
3
4
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

接着声明一个队列; 在RabbitMQ中,消息不是直接发送到队列,而是先发送到交换机(exchange), 由交换机发送到队列。

1
channel.queue_declare(queue='hello')

使用basic_publish发送消息。 这里使用默认交换机(‘’), routing_key参数指定为队列名称

1
channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
阅读全文 »

数组(vector)

初始化

1
2
3
vector<int> v(size);
vector<int> v(size, init_value);
v.emplace_back(a.begin(), a.begin() + 3); # 用另一个vector的某一区间初始化vector

遍历数组

1
2
3
for (int i = 0; i < vec.size(); ++i) {
vec[i] = i;
}

数组追加到另一个数组

1
vec1.insert(vec1.end(), vec2.begin(), vec2.end());

排序数组+去重

1
2
sort(nums.begin(), nums.end());
nums.erase(unique(nums.begin(), nums.end()), nums.end());

逆序排序

1
sort(nums.begin(), nums.end(), greater<int>());

二维vector初始化

1
vector<vector<bool>> visited(rows, vector<bool>(cols, false));
阅读全文 »

Docker Compose 是什么

Docker Compose 是一个用于运行多容器应用的工具, 通过一个docker-compose.yml文件, 配置应用的服务、网络和卷,然后使用简单的命令启动或停止所有服务

为什么需要 Docker Compose

当你有一个包含多个相互依赖的容器应用时,手动管理每个服务的启动、停止以及配置会比较复杂且容易出错
Docker Compose 提供了一种更简便的方法, 在单节点部署多个容器, 使得开发测试环境的一致性得到保证,同时简化了部署过程

示例: 使用Docker Compose 部署一个WordPress站点

下面演示如何使用 Docker Compose 在单个节点上部署一个包含 WordPress 和 MySQL 的简单网站。

1. 安装Docker Compose

官网上查找匹配版本安装, 我直接取最新版本安装

1
2
3
curl -L "https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
阅读全文 »

前言

在我之前的项目中,对微服务升级采用的做法是删除整个namespace, 再重新应用所有yaml。 这种方式简单粗暴,但是不可避免的导致服务中断,影响了用户体验
为了解决更新服务导致的服务中断问题, Kubernetes提供了一种有效的服务升级方式 —— 滚动更新(Rolling Update)

什么是滚动更新(RollingUpdate)

滚动更新是一种部署策略。 允许用户逐步替换旧的Pod实例为新版本,而不是一次性替换所有Pod,从而实现零停机时间的部署更新。 解决了如下问题:

  • 最小化停机时间, 滚动更新可以在不完全停止服务情况下进行,提高用户体验
  • 故障恢复, 如果新版本出现问题,可以迅速回滚到之前的稳定版本
  • 平滑流量迁移, 避免瞬间全部更新导致的流量冲击和服务中断

RollingUpdate策略有两个重要参数:

  • maxUnavailable, 滚动更新时最多可以有多少个Pod不可用。 默认值为25%,这意味着如果有一个包含4个Pod的服务, 更新期间至少有3个Pod可用
  • maxSurge, 滚动更新时可以临时超出期望副本数的额外Pod数, 默认值为25%

说明: 对于关键业务, 可以用保守的设置, 比如maxUnavailable=0, maxSurge=1; 较大的maxSurge可以加快更新速度,但增加了集群压力; 根据实际情况调整这两个参数

实践案例

写一个简单的微服务, Pod副本数设置为5, 观察Kubernetes滚动更新过程

阅读全文 »

环境准备

Rocky Linux 9

安装步骤

安装Signing Keys(签名密钥)

1
2
3
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
rpm --import https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key
rpm --import https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key

创建repo文件

在/etc/yum.repos.d/目录下创建一个名为rabbitmq.repo的文件,并添加以下内容:

阅读全文 »

问题描述

我在VMware ESXi上,用官方Rockylinux minimal ISO装了一台Linux机器。导出OVA文件发现大小有3个G。查看OVA文件,发现有个ISO文件占了2G,这个ISO文件用不到,如何删除?

1
2
3
4
5
6
# tar tvf va.ova
-rw-r--r-- someone/someone 9876 2024-12-17 02:27 va.ovf
-rw-r--r-- someone/someone 345 2024-12-17 02:27 va.mf
-rw-r--r-- someone/someone 1829634048 2024-12-17 02:27 va-file1.iso
-rw-r--r-- someone/someone 1332535296 2024-12-17 02:28 va-disk1.vmdk
-rw-r--r-- someone/someone 8684 2024-12-17 02:28 va-file2.nvram

解决方法

Poweroff虚拟机,修改虚拟机配置,把光驱删掉,再重新导出OVA即可

阅读全文 »