初识MQTT与mosquitto
最近,接手一个新的项目 —— 电子价签。对于电子价签的常见架构,阿里云有一篇文章描述的非常详细(网址见文章末尾),里面包含一个核心的概念 MQTT。由于第一次接触MQTT,特此整理相关知识点,以备后用。
MQTT是什么MQTT (Message Queuing Telemetry Transport 消息队列遥测传输),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。
mqtt官网 https://mqtt.org
MQTT 是 IBM 推出的一种针对移动端设备的基于 TCP/IP 的发布、订阅协议
可以连接大量的远程传感器和控制设备(MQTT特点是可以保持长连接,具有一定的实时性)
云端向设备发送消息,设备端可以在最短时间内接收到并作出响应
MQTT 适合需要实时控制的场合
MQTT协议特性
使用发布、订阅消息模式。提供一对多的消息发布,解除应用程序耦合
有三种消息发布服务质量(QoS0、QoS1、QoS2)
最多一次 消息发布完全依赖底层 TCP/IP 网 ...
认识CDC工具go-mysql-transfer
1.认识CDCChange Data Capture(简称CDC):其主要作用是用来捕获数据的变更,在数据发生变化之后,把变更后的数据同步到其他异构数据服务中。例如:通过订阅MySQL中binlog日志,将MySQL中发生变化的数据同步到Redis、kafka、Es等存储服务中。
在现实开发中有一些场景会用到CDC工具,例如:
数据库数据发生变化,异步更新缓存
业务中同时更新DB、cache,需要考虑边缘问题(面试问题:数据库、缓存不一致时如何解决?)
数据存储到MySQL之后,需要同步到ES以便可以使用全文检索
MySQL对全文搜索支持的不是很好,通常全站搜索都会使用ES来做搜索引擎
大数据分析 Warehouse, 实时同步数据,离线分析等等
> 图片来自 DDIA
如果不使用CDC工具处理数据,需要在业务中耦合数据同步的逻辑。数据存储与数据同步到其他服务这两个操作,往往需要包含在同一个事务中,否则可能会造成一个成功、一个失败,从而导致数据的不一致性。而为了处理这些问题需要写很多的兼容代码,也就导致了非业务操作耦合到业务中,会对项目造成一定的负担。
所以,最好 ...
docker desktop 安装 K8s 时遇到的一些问题
使用 docker desktop 在 Mac OS 上搭建 Kubernetes 环境比较简单,但是搭建过程中可能会遇到一些问题,问题解决起来就没有那么简单,特此整理相关内容以备后续之需。
笔者第一次在Mac上搭建花了一天时间
1.下载/安装 docker desktop① 下载 docker desktop
12345# 地址1https://hub.docker.com/search?type=edition&offering=community&q=# 地址2https://www.docker.com/get-started/
② 安装成功之后,查看版本信息
2022/06/29
Engine: 20.10.16Kubernetes: v1.24.0
2.配置docker源 & 下载Kubernetes镜像①下载 k8s-for-docker-desktop
1git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop
在 ...
gitlab+reviewdog+golangci-lint实现提交MR时进行代码检测
本文使用 shell 作为 gitlab-runner 执行器 (executor) 演示提交 MR 时执行代码检查。
gitlab搭建参考文章:<基于docker搭建的gitlab实现CI/CD>,本文只是把文章中 runner 执行器由 docker 变成了 shell。
1.准备工作
安装gitlab-runner、reviewdog、golangci-lint
123456#安装 gitlab-runnercurl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash#安装 reviewdogcurl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s#安装 golangci-lintcurl -sSfL https://raw.githubusercontent.com/golangci/go ...
golangci-lint配置与使用
1.golangci-lint是什么golangci-lint按照官方的说法是用于go语言的代码静态检查工具集(因为包含它多种 Go 代码检查工具)。
官网 https://golangci-lint.run/
特性:1.快速:并行非执行 linters,可以复用 Go构建cache和caches分析结果2.配置文件基于yaml语法进行配置3.可以与常见开发工具集成,例如:VS Code、Sublime、Goland、Emacs、Vim、Atom、Github Actions4.包含了很多 linters,不需要安装5.执行结果输出带有美观,不仅带有颜色,还有源码行号和标识6.尽可能的减少误报,可以通过设置忽略某些模式
2.Goland 中集成 golangci-lint针对不同的开发工具,官方给出了不同的集成方式,本文暂时只讲解一下 golangci-lint 在 Goland 中的两种集成方式。
https://golangci-lint.run/usage/integrations/
golangci-lint 的安装安装 golangci-lint 常用的方式主要有2种 ...
基于docker搭建的gitlab实现CI/CD
在开发过程中,提起CI/CD就会想到使用gitlab来实现。本文使用docker搭建gitlab环境,基于官方文档说明并尝试对常见CI/CD操作做讲解说明。
1.gitlab 所需硬件配置目前,gitlab对内存要求最小是4G。本文使用服务器配置:阿里云ECS,4核8G
配置低的话,容易把系统搞死,gitlab 比较占资源
2.安装docker
卸载老版本docker
12345678yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
安装docker基础包
1yum install -y yum-utils device-mapper-persistent-data lvm2
设置仓库
1yum-config-manager --add-repo https://mirr ...
docker多阶段构建
多阶段的构建对于那些努力优化 Dockerfiles 的开发者来说非常有用,同时也使 Dockerfiles 更易于阅读和维护。
1.多阶段 build 之前的 buildbuild镜像 最具挑战性的事情之一是使镜像变得更小。Dockerfile 中的每条指令都会为镜像添加一层,需要记住的是要清理任何不需要的内容,然后再进入下一层。为了编写一个非常有效的 Dockerfile,传统上需要采用shell技巧和其他逻辑来保持每一层尽可能小,并确保每一层都具有上一层中所需的内容,而没有其他多余内容。
实际上,一个用于生产环境的 Dockerfile(其中包含构建应用程序所需的一切),其中仅包含您的应用程序以及运行它所需的内容,并尽可能的小。这被称为 “builder pattern”。而维持两个 Dockerfiles 也不是理想的选择。
下面举一个使用 Dockerfile.build 与 Dockerfile 进行构建的例子。
Dockerfile.build:
123456# syntax=docker/dockerfile:1FROM golang:1.16WORKDIR /go/s ...
go中slice append扩容的一些细节
1.问题与事件事件:一个朋友面试某家公司问题:对容量为4的int切片追加5个元素,最终切片的容量是多少?
针对该问题,朋友回答:16
该问题考察slice扩容:①在容量小于1024时,在原基础上2倍扩容 ②大于1024时,在原基础上1/4的扩容
面试官回答说:10
让回去自己试一下,看看具体是多少?
事后分析了一下,能确定的是:面试官提出的问题,有4种写法。
2.同一个问题不同写法的不同结果在4种写法执行之前,你觉得最终的容量cap分别会是多少?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546func TestSliceAppend(t *testing.T) { SliceAppend0() SliceAppend1() SliceAppend2() SliceAppend3()}// slice 长度为0,容量为4,批量追加5个元素func SliceAppend0() { m := make([]int, 0, 4 ...
Innodb引擎可重复读的幻读现象
关于幻读众所周知,MySQL不同的隔离级别可能会出现不同的问题。其中,有一问题就是在可重复读隔离级别会出现幻读问题。可能会有人说:不是说MySQL的可重复读隔离级不会出现幻读吗?怎么会出现幻读?
这里有2个问题需要明确:① MySQL官方并未说明可重复读隔离级别不会出现幻读② 什么是幻读
问题① 查看MySQL官方相关资料,官方也会标明可重复读隔离级别可能会出现幻读问题② 要理解幻读是可见与不可见的一种权衡。如果用一句话说明,那就是:幻读是看不到数据,却能感受到它存在的一种现象
产生幻读的本质是不同读的方式:当前读 or 快照读,这两种方式的选择
数据库中数据操作方式,一般分为如下四种:1.SELECT2.INSERT3.UPDATE4.DELETE
在可重复读隔离级别中,SELECT 操作不会对数据造成影响,剩余的三种操作则会对数据造成影响。并且,这几种操作看待数据的方式也不太一样。SELECT 使用快照读,剩余三种操作使用当前读。
活跃事务数组与可见性在事务开启之后,每个事务会持有一个当前活跃事务数组,活跃事务数组中保存着当前存在却还未提交的事务ID。对这些事务ID进行排序 ...
go字符串无拷贝转换切片的一个问题
1.字符串无拷贝转换切片提起 字符串无拷贝转换切片 这个话题,可能很多人会想到下面一段代码:
123func string2Slice(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s))}
这段代码利用了指针进行强转,并且在实现过程中不会出现数据拷贝,简单、强大!
2.同一切片多次获取容量结果不相同来看一个测试用例:
123456789101112131415161718192021222324package testimport ( "fmt" "testing" "unsafe")func string2Slice(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s))}func TestString2Slice(t *testing.T) { for i := 0; i < 3; i++ { s := string2Sl ...