




C大调音阶在吉他指板上可以有不同的把位 https://www.zhihu.com/tardis/zm/art/496745355?source_id=1005
扫弦节奏型:1)下 下 下上 上下上下 下上
节拍
HUB GUITAR: https://hubguitar.com/zh_han/music-theory 指板: https://hubguitar.com/zh_han/fretboard
弹奏第一品位上的B弦,这就是 C音,一个以一定频率振动的音波。接下来你拨第十三品的同一根弦,同样地,它听上去好像是同一个音,但这个音高更高。这是因为声波的振动是原来的两倍之快,可以表达为1:2, 它们是有同一特性的音。如果两种不同的乐器同时弹奏C音,这个比例是1:1,这称为 同音。在下图中,第一品的音符将会是最左边的C,第十三品的音则是在最右边。所有在这两者之间的音符都是特定的音符,但一旦重新回到C音,就重新按照这个顺序继续下去。
音程:就是两个音符之间的高低关系。在较低的一个 “C” 音和另一个较高的 “C” 音之间的音程就是 八度(八音音阶)。八度是音高的基本来源,其余的还包括将它分成更小的部分而得到的音高,称为 音数。半音就是移动一格,从 C 到 C♯。全音移动两格,从 C 到 D。 大多数现代音乐将八度分割为12级,如图所示,你可以按照这个音符的顺序来弹奏,从第一品的 B 弦开始,每次移动一个品位,直到第十三品,重新回到 C,一边弹奏一边大声说出这个音符的名字。所有这十二个音符一起组成了 半音音阶。音阶就是音符的顺序,并且没有重复的音符,所有的音符以升序,从低到高的顺序来弹奏。
根音?它就是一首歌的主调音,它是一个单音,其余的东西全在它的基础上变化,想像它是重力中心,它是一种吸引力,吸引着一首歌曲里其余所有的音,不管什么情况下都会回到根音上来。
晴天 - 周杰倫
Hey Jude - The Beatles
紅豆 - 方大同
找自己 - 陶喆
Canon in C https://www.bilibili.com/video/BV1if4y1A7SZ/
揪心的玩笑與漫長的白日夢 - 萬能青年旅店
https://www.bilibili.com/video/BV1cuHjetENY/?vd_source=ff210768dfaee27c0d74f9c8c50d7274
Docker 是一种开源平台,一种快速构建、运行和管理应用的工具。它使用容器化技术,使得应用程序及其依赖性可以打包到一个容器中,并在任何支持 Docker 的环境中运行。
1 MobarXterm 通过 SSH 连接 linux虚拟机,操作虚拟机上的 Docker。
2 Windows本地:通过wsl安装Linux发行版本,安装docker desktop(将自动在WSL中配置Docker环境,借助linux内核运行)
1 | docker run -d \ # 创建并运行一个容器,-d 是让容器在后台运行;同一个镜像可创建多个容器 |
1 | docker images # 查看本地镜像 |
镜像结构:入口,层,基础镜像。分层的好处是可复用,,
docker build
命令构建镜像。(如java项目还需要jar包)docker run
命令基于构建的镜像创建和运行容器。1 | docker volumels # 查看数据卷 |
容器编排是指在生产环境中管理和协调多个容器的过程。Docker 提供了 Docker Compose 工具,用于定义和运行多容器的应用。
Kubernetes是一个开源的容器编排引擎,可以用来管理容器化的应用,包括容器的自动化的部署、扩容、缩容、升级、回滚等等;
它是Google在2014年开源的一个项目,它的前身是Google内部的Borg系统。
在Kubernetes出现之前,我们一般都是使用Docker来管理容器化的应用,但是Docker只是一个单机的容器管理工具,它只能管理单个节点上的容器,当我们的应用程序需要运行在多个节点上的时候,就需要使用一些其他的工具来管理这些节点,比如Docker Swarm、Mesos、Kubernetes等等;
这些工具都是容器编排引擎,它们可以用来管理多个节点上的容器,但是它们之间也有一些区别,比如Docker Swarm是Docker官方提供的一个容器编排引擎,它的功能比较简单,适合于一些小型的、简单的场景,而Mesos和Kubernetes则是比较复杂的容器编排引擎;
Mesos是Apache基金会的一个开源项目,而Kubernetes是Google在2014年开源的,目前已经成为了CNCF(Cloud Native Computing Foundation)的一个顶级项目,基本上已经成为了容器编排引擎的事实标准了。
Node:k8s集群节点,可以是物理机/虚拟机
Pod:k8s最小调度单元,容器(运行app/数据库/..镜像)的抽象,可以是一/多个容器的组合,但除非高度耦合,一个pod只运行一个容器
Service:将一组pod封装成一个服务并且提供统一访问入口(解决了一组数据库pod中一个重建后ip变化的问题,类似于“服务发现”)
Ingress:为了对外提供服务,将外部请求路由转发到内部集群的service上
ConfigMap:封装配置信息
Secret:封装敏感信息
其他安全机制:网络安全,访问控制,身份认证
Volumn:将数据挂在到本地磁盘或远程存储上,实现持久化存储
Deployment:部署无状态应用程序,将一/多个Pod组合到一起;冗余备份,相当于对Pod的抽象;具有副本控制、滚动更新、自动扩缩容等功能,实现应用程序的高可用
Statefulset:部署有状态应用程序,如DB、MQ、缓存以及保留会话状态的应用程序
分为Master和Worker节点
apiserver:位于master节点上,是k8s集群的API接口;交互方式包括 kubectl
命令行、Dashboard界面或API接口
minikube是一个轻量级的kubernetes集群环境,可以用来在本地快速搭建一个单节点的kubernetes集群;
https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/ 你好,Minikube
minikube只能用来在本地搭建一个单节点的kubernetes集群环境,
下面介绍如何使用Multipass和k3s来搭建一个多节点的kubernetes集群环境,
1 | # 查看帮助 |
1 | # 创建并运行一个指定的镜像 |
1 | # 查看集群中某一类型的资源 |
1 | # 更新某个资源的标签 |
1 | # 进入某个Pod的容器中 |
Portainer 是一个轻量级的容器管理工具,可以用来管理Docker和Kubernetes,它提供了一个Web界面来方便我们管理容器
官方网址: https://www.portainer.io/
Helm 是一个Kubernetes的包管理工具,可以用来管理Kubernetes的应用,它提供了一个命令行工具来方便我们管理Kubernetes的应用
官方网址: https://helm.sh/
https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
InfluxDB 是一个由InfluxData开发的开源时序型数据库,专注于海量时序数据的高性能读、高性能写、高效存储与实时分析等;
在DB-Engines Ranking时序型数据库排行榜上排名第一,广泛应用于DevOps监控、IoT监控、实时分析等场景。
https://jasper-zhang1.gitbooks.io/influxdb/content/Introduction/getting_start.html
influxdb-cluster 是InfluxDB的集群版本,InfluxDB Enterprise 的开源替代方案,设计用于大规模数据存储和高可用性需求。
可以实现数据的分片和复制,从而提高系统的可用性和扩展性。数据安全。operator缺失
https://github.com/chengshiwen/influxdb-cluster/wiki
InfluxDB Enterprise由两组软件进程组成: Data 数据节点 和 Meta 元节点。集群内的通信是这样的:
influxdb使用的默认端口号为分别为用于meta集群内部服务的8091端口,meta节点通信的8089端口,data集群内部服务的8088端口,以及data节点对外提供http服务的8086端
InfluxDB 集群中,一个节点要么是专门用于存储和查询时间序列数据的数据节点,要么是专门用于存储集群元数据的元节点。数据节点负责存储实际的数据和处理查询请求,而元节点则负责管理集群的元数据,包括节点信息、数据库和保留策略等。
元节点保存以下所有元数据:
元节点将这些数据保存在磁盘上的Raft数据库中,由BoltDB提供支持。默认情况下,Raft数据库是/var/lib/influxdb/meta/raft.db。
注意:Meta节点需要/ Meta目录。
influxd-meta
元数据服务1 | # 配置文件示例(meta节点) |
influxd-ctl
集群管理1 | # 查看分片分布 |
数据节点保存所有原始时间序列数据和元数据,包括:
在磁盘上,数据总是按照
influx
CLI工具1 | # 进入容器执行CLI |
influxd
数据节点服务1 | # 查看运行状态 |
influx_inspect
数据工具1 | # 导出TSM文件(需进入容器) |
通信协议
组件 | 端口 | 用途 | 协议 |
---|---|---|---|
Meta节点间 | 8089 | Raft协议同步元数据 | TCP |
Data节点间 | 8088 | 分片数据复制 | TCP |
Data→Meta节点 | 8091 | 注册节点/获取分片元信息 | HTTP |
核心交互场景
节点注册 : Data节点启动时通过HTTP API向Meta节点注册(POST /data
)
分片分配 : Meta节点根据replication-factor
策略分配分片到Data节点
写入协调 : 客户端写入数据时,由Meta节点确定目标分片所在Data节点
故障转移 : Meta节点检测Data节点离线后,自动通过Hinted Handoff机制转移副本
一个集群至少要有三个独立的元节点才能允许一个节点的丢失,如果要容忍n个节点的丢失则需要2n+1个元节点。集群的元节点的数目应该为奇数。不要是偶数元节点,因为这样在特定的配置下会导致故障。
一个集群运行只有一个数据节点,但这样数据就没有冗余了。这里的冗余通过写数据的RP中的副本个数来设置。一个集群在丢失n-1个数据节点后仍然能返回完整的数据,其中n是副本个数。为了在集群内实现最佳数据分配,我们建议数据节点的个数为偶数。
1 | $ influx -precision rfc3339 |
1 | <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp] |
1 | > use testdb |
1 | > SELECT "host", "region", "value" FROM "cpu" |
1 | curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000' |
1 | curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'" |
shard := shardGroup.shards[fnv.New64a(key) % len(shardGroup.Shards)]
4/2=2
个分片(Shard 1 & 2)cpu,host=svr1 usage=80
:Series Key = cpu,host=svr1
,哈希值模2=1 ⇒ 分片2,数据同时写入节点 C 和 DSELECT * FROM cpu WHERE time > '2025-04-02'
:定位到 2025-04-02 分片组, 协调节点同时向 A/B(分片1)和 C/D(分片2)发起查询, 合并结果后返回Docker安装操作单例InfluxDB https://www.cnblogs.com/nhdlb/p/16409849.html
Docker快速开始集群InfluxDB https://github.com/chengshiwen/influxdb-cluster/wiki#docker-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B
在使用容器多节点部署InfluxDB时,数据库、容器、Docker、主机和Kubernetes(k8s)之间的关系可以理解如下:
Kubernetes 存储与 InfluxDB Shard 的关系解析
/var/lib/influxdb/data
目录下。/var/lib/influxdb/data/<database>/<retention_policy>/<shard_id>
。Delete
(默认),删除 PVC 会导致 Kubernetes 清理其绑定的 PV 及底层存储数据(如 NFS 目录、云盘等)。此时 /var/lib/influxdb
下的 data
、meta
目录被清空,导致 Shard 文件丢失。ERR: shard not found
错误。https://docs.influxdata.com/enterprise_influxdb/v1/administration/backup-and-restore/
https://blog.csdn.net/weixin_46560589/article/details/127748939
InfluxDB Enterprise支持在集群实例、单个数据库和保留策略以及单个分片中备份和恢复数据。
1 | influxd backup -portable /path/to/backup |
1 | influxd backup -portable -database <database_name> /path/to/backup |
1 | influxd backup -portable -start <timestamp> /path/to/backup |
备份的数据可以恢复到新实例或现有实例中。
1 | influxd restore -portable /path/to/backup |
1 | influxd restore -portable -db <database_name> /path/to/backup |
-newdb
选项来实现:1 | influxd restore -portable -db <old_database_name> -newdb <new_database_name> /path/to/backup |
对于大多数InfluxDB Enterprise应用程序,备份和恢复实用程序提供了备份和恢复策略所需的工具。但是,在某些情况下,标准备份和恢复实用程序可能无法充分处理应用程序中的大量数据。作为标准备份和恢复实用程序的替代方案,可以使用InfluxDB influx_inspect export和涌入-import命令为灾难恢复和备份策略创建备份和恢复过程。
1 | root@influxdb-e2cb6c913a191e56c134e-data-0:/# influx_inspect export -datadir "/var/lib/influxdb/data" -waldir "/var/lib/influxdb/wal" -out "influxdb_test01_dump_out" -database "test01" -start "2024-10-22T00:00:00Z" |
1 | root@influxdb-e73f149ff7192bd87d190-data-1:/# influx -import -path='influxdb_test01_dump_out' -precision=ns -username='' -password='' |
-database
,加 -compress
-compressed
导入压缩文件,本质上是先解压后倒入Data节点迁移方案评审:先迁移后逐个恢复分片数据。已验证在分片副本大小70M、写入数据达2000point/s的情况下直接copy-shard会导致增量数据丢失,考虑在copy-shard前先执行truncate-shards截断热分片(集群中所有写入最新数据的分片,截断后关闭写入,变成冷分片),并在所有Data节点上创建该分片的新热分片副本,也就是在迁移节点上恢复了全部原有分片的新热分片副本,最新数据写入这个副本,然后再逐个从健康节点上的冷分片副本copy-shard恢复出分片的历史数据(迁移前分片副本原有的数据&迁移过程中未能写入的数据),该分片数据完全恢复;自测符合预期
1 | kubectl exec -i influxdb-xx-meta-0 -n influxdb -- influxd-ctl show-shards # 或influx命令行执行show shards |
1 | kubectl exec -i influxdb-xx-meta-0 -n influxdb -- influxd-ctl remove-data influxdb-xx-data-0.influxdb-xx-data:8088 |
1 | kubectl exec -i influxdb-xx-meta-0 -n influxdb -- influxd-ctl truncate-shards |
1 | # 对于_internal分片的转移 先copy后remove |
1 | # 分片的物理文件 wal&tsm |
1 | # 可能要等wal落tsm |
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
除了OOP外,近年出现了一些小众的编程哲学,Go语言对这些思想亦有所吸收。例如,Go语言接受了函数式编程的一些想法,支持匿名函数与闭包。再如,Go语言接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。总体来说,Go语言是一个非常现代化的语言,精小但非常强大。
go.mod
文件是声明依赖的地方,记录了项目的依赖关系。如果项目中没有 go.mod,需要先运行 go mod init
来初始化模块。然后使用 go get
(或其他命令)来引入依赖,下载到本地缓存(~/go/pkg/mod
),并更新 go.mod,添加对应的模块路径和版本要求。go.mod
文件声明并被解析(否则报错),将编译代码并链接所有必要的依赖来生成最终的可执行文件或库文件。如果 go.mod 中声明的依赖尚未下载,Go 工具链会自动为你下载这些依赖。如果你的项目中没有 go.mod,go build 将无法正确识别和下载依赖(除非是 Go 1.11 前的版本)go.mod
文件的 Go 项目,项目所需的依赖不会自动下载到本地环境中。需要手动运行 go mod download
或 go mod tidy
来下载依赖,或者直接运行 go build
以触发依赖的下载。go.mod
文件中声明的版本不同,Go 工具链会优先使用 go.mod
文件中指定的版本。Go 会从远程仓库下载与 go.mod
兼容的依赖版本,并将其存储在本地缓存目录(通常是 ~/go/pkg/mod
)中。go env
中的配置(看上去是如果配置全局 PATH=%GOPATH%\bin 就使用 GOPATH 中的go.exe和pkg)Makefile
文件,执行 build来构建项目。1 | D:\Users\caifeng7>wsl -l -v |
1 | sudo apt update |
1 | echo 'export PATH=$PATH:/root/go/bin' >> ~/.bashrc |
1 | root@caifeng7138:/mnt/c/Windows/system32# go env |
/mnt/d/code/datamars-agent/
1 | root@caifeng7138:/mnt/d/code/datamars-agent# go env |
通过对国民收入的再分配,使公民在遇到特定风险或困难时能够获得基本生活保障。本质是追求一种公平。
佛山社保卡如何申领?“一人一卡”清理又是个啥? https://mp.weixin.qq.com/s/9uQ5qGOYv35BGRgs4OvzvA
没领佛山社保卡可以使用医保报销吗?可以,微信支付时会显示报销数额。
如何使用医保余额?办理实体医保卡,可以查到余额。
个人所得税丨2024年个人综合所得年度汇算操作指引 https://mapmpm5.midea.com/newservicenopages/#/content/preview?id=1896853229331374081
个人的汇算清缴,就是把您2024年一整年取得的劳动收入(税法中叫“综合所得”,具体指工资薪金、劳务报酬、稿酬、特许权使用费共4项)合并计算个税,得出应纳个人所得税,与2024年实际预扣预缴的个税比较,税款多退少补。预缴税款与实际应缴税款产生差异的核心原因在于预扣预缴机制与全年综合计算的逻辑差异。
预扣预缴是基于局部数据和固定规则的估算,而汇算清缴是基于完整数据和真实扣除的精准计算,
建议:通过“个人所得税APP”提前核对收入明细和扣除项,利用汇算规则合法降低税负(如优化年终奖计税方式)。以下是具体原因分析:
情形 | 补偿标准 | 法律依据 | 维权路径 |
---|---|---|---|
企业合法解除未提前通知 | N+1 | 《劳动合同法》第40条 | 协商或仲裁主张代通知金 |
企业违法解除 | 2N | 《劳动合同法》第87条 | 劳动仲裁或诉讼索赔双倍赔偿 |
员工被迫离职(企业过错) | N | 《劳动合同法》第38条 | 提交证据申请仲裁 |
【当代年轻人没了铁饭碗,还能负重奔跑多久?北京二胎家庭如何转移风险?】 https://www.bilibili.com/video/BV16F4m1V7wv/?share_source=copy_web&vd_source=2cbe8cdd54a75d0c43fcdefa624d3fbe
“年纪轻的一定要买百万医疗险和意外险,还有抗癌险,关键时候真的能救命的,有余裕买个重疾险,如果生病了确证了就能拿到几十万的保额,可以作为治疗和康复期的生活费开销,医疗费有医保和百万医疗险,到时候真生比较严重的病百分之九十能报销,年纪轻买了便宜加起来一年千把块,父母没生病可以给他们买众民保和中银全名保,还有当地的惠民保三个加起来六百块不到,不看健康告知年龄大可以报销,配合医保大概能报销八十花的多甚至能报销到九十,给家里老人多套保障,不会出现得了病只能放弃的人间惨剧,如果老人没医保可以买城乡医保一年几百块”
mom:东莞农村?居民社保医保,莞家福,莞家福居民保?,midea家属保险
2025年度商业保险开始投保了~ 员工(统一投保无需美福下单)本人及任选两名家属的免费/自付费升级方案 https://mapnew5.midea.com/newservicenopages/#/content/detail?id=1902351310562877442&type=2
根据您母亲的情况(47岁、乳腺癌病史、已参保东莞社保及莞家福),结合健康限制和保障需求,以下是商业保险的配置建议及具体产品的分析:
具体产品对比分析
产品类型 | 推荐产品 | 核心优势 | 局限性 | 年保费参考 |
---|---|---|---|---|
乳腺癌复发险 | 泰康粉红卫士 | 保费最低(1400元起),特药覆盖最全(41种) | 仅限0-2期患者,续保需审核 | 1400-5000元 |
乳腺癌复发险 | 太平洋粉红守护 | 含对侧乳腺癌保障,特药清单更新快(48种) | 仅限0-2期患者,保费较高 | 2000-8000元 |
惠民保 | 众民保(全国版) | 覆盖复发治疗,含CAR-T疗法和质子重离子 | 免赔额高(2万),报销比例50%-80% | 150-300元 |
团体医疗险 | 太平洋企业合作套餐 | 无健康告知,可能覆盖既往症 | 需确认保额和报销范围(可能仅限社保内) | 企业合作价(待确认) |
建议优先投保乳腺癌复发险(专项保障),再补充惠民保和意外险,最后根据企业团体险条款决定是否叠加。
建议通过保险顾问协助核保(如众安、慧择平台),确保理赔无争议。
类别 | 比例 | 工具示例 | 目的 |
---|---|---|---|
学习投入 | 10% | 付费研报、专业课程 | 知识体系构建 |
模拟交易 | 0% | 同花顺模拟盘、Backtrader | 策略验证 |
指数定投 | 40% | 沪深300ETF(A股) | 强制储蓄+市场β收益 |
行业ETF | 30% | 半导体ETF(512480) | 把握结构性机会 |
现金储备 | 20% | 货币基金 | 应对黑天鹅事件 |
1 | | 日期 | 操作 | 决策依据 | 情绪状态 | 事后评估 | |
下一步行动建议:
你的技术背景是独特优势,建议从**”工程师型投资者”路径切入,将编程能力转化为投资生产力。记住:在认知不充分时,不亏损比追求收益**更重要。
入职第一天,熟悉运维平台,目标实现其自动化,后续参与到美的云,?
熟悉新旧平台的功能和调用关系,拆分业务需求开发步骤,编写文档,每日汇报进展,熟悉开发流程、、
软工院作为非互联网公司的非核心业务的底层平台建设部门,结果导向,组员多一年社招;)无校招培养。?
EDP培训 + MGC(头脑风暴/产品调研/拉通对齐>>技术)
T型人才(广度+深度),开发技术+产品思维->架构师
不设限,主动承担任务,机会莫名来:) take other people’s jobs and become indispensable to the team..
复杂的事情简单化(思考简化),简单的事情复杂化(做到极致)
工作就是生活,生活就是工作,不需要平衡(找到热爱的工作)
成功的百分比 = 做事 / (个人 + 做事);做事的比例越大,成功的概率越大
Allen: 向上管理?× 向上反馈,同步进展
MGC结营
融入团队?主动承担?谈论未知?如何选择自己在团队中的角色,人设??
圈子
佛山校友会迎新
“努力会发光,先有为后有位”,“头三年不要动,把这一套学会”
程序员的本质核心竞争力是什么?1.开发都是那一套 2.专精一个领域 3.meet新公司的需求 4.解决问题的能力
ALEX:最近和一些软工院同学深入聊了一下他们的职业发展规划,
华为云主机开/关机/重启自动化 : mq、定时任务、公有云api、crud、、
完成第一版8.14,自测8.15,,merge request,code review,sit,测试,uat,发版8.22、、
反思、、在开发同事的指导下完成了开发,不具备独立调研和开发能力,,
缺少对产品的思考??没有对需求进行120%的思考和完成。。
顺德校友会迎新
why Midea?1.生活成本低(特别是住宿好通勤方便)2.相比下工作轻松(能够有自己的时间学习业务以外的东西)
思考自己在..年后会到什么层次(本科毕业+6y ?= 博士毕业起步)。。阶段性目标
深入一个领域,,
先做一点功能点,然后负责一个模块,到不同系统的交互、、
多学基础,与外包的区别。。与人沟通的能力
幂等,整体设计,微服务治理,看项目源码,,
干半年就不是应届生了。社会很残酷,前两年要快速成长;思考两/五年后的情况、、
开发整个过一遍,打包,发版,,
多讨论,多问,code review
!!邮件:设计一个功能,,关注点,逻辑路径,通用性,,如何表述。。?! –>
Linux基本命令:
netstat ; top; awk ; dstat; iostat; lsof; free;uptime;dmesg ;dig ; nslookup
vim/vi的基本快捷命令(shift + g; dd;yy等)
终端的一些快捷命令(ctrl + a; ctrl + e)
方法:事务+行锁【悲观锁】,避免在高并发场景下先读后写导致多个线程同时读取相同的值然后同时写入引发数据不一致的问题
测试:线程池多线程访问,打印数据,排查重复值;考虑数据库连接池配置
思考:项目部署到多节点下,则是多进程的多线程环境,需要用Redis分布式锁,或者唯一的全局数据库节点加锁;
单节点的多线程才能用synchronized?、
1 |
|
1 |
|
Azure公有云主机申请 :根据云管界面配置配齐参数发送报文到作业平台,完成自动化主机创建和标准化
对其参数,连续加班,9.9完成第一版,9.10上sit前端联调,9.11开发部分发邮件,9.12上uat,6.同步DDL&DML,7.发版,验收成功
接触运维协同,,code review,联调,,集成,部署,流水线,,
窝囊费:)120
Azure公有云主机回收/开/关机/重启 : 调研AzureApi和测试方法,开发,,
9.23回收上sit,9.24开关机重启代码重构(原华为云方法过于通用),9.25bug毁了我的足球梦,9.26配置ngix上uat,验收
思考:自测可以 1.全流程验证 2.单独功能验证 3.考虑开发与测试环境的区别(ping的包装方法/命令行执行在开发/测试环境的区别)
后续:完善公有云开发(Azure回收配额,ip,失败邮件),后续由运维平台MOPS -> 参与到数据库开发
任务触发式失败邮件完成,改造为工单定时任务扫描式,10.17上线
邮件通用性??工单+定时任务层面的通用,,
数据管控平台DataMars: 云管cmcloud开发功能,先提供内部服务,后到SAAS,,
InfluxDB备份恢复 1 调研 2 手工实现 3 详细文档
2-3月时间,不要求11月上线,整体设计,转正答辩
api,数据库内核?,容器,k8s
容器,登录主机,查看docker实例,操作数据库实例
1 | rouser20@(datamars)mhpl74337-10.20.248.65 ~$ sudo su - apps |
influxdb
命名空间下的所有 Stateful1 | apps@(datamars)mhpl74337-10.20.248.65 ~$ kubectl get sts -n influxdb |
influxdb
命名空间下的所有 Pod 的状态和节点信息1 | apps@(datamars)mhpl74337-10.20.248.65 ~$ kubectl get pod -n influxdb -o wide |
influxdb
命名空间下的 service 信息。1 | apps@(datamars)mhpl74337-10.20.248.65 ~$ kubectl get svc -n influxdb |
kubectl exec
进入指定的 Pod(默认进入其中的第一个容器),并启动一个 bash shell;可以看到当前 InfluxDB 版本是v1.8.10-c1.1.21 | apps@(datamars)mhpl74337-10.20.248.65 ~$ kubectl exec -it influxdb-e2cb6c913a191e56c134e-data-0 -n influxdb -- bash |
1 | root@influxdb-e2cb6c913a191e56c134e-data-0:/# influx |
1 | root@influxdb-e2cb6c913a191e56c134e-data-0:/# influx_inspect export -datadir "/var/lib/influxdb/data" -waldir "/var/lib/influxdb/wal" -out "influxdb_test01_dump_out" -database "test01" -start "2024-10-22T00:00:00Z" |
1 | sudo kubectl cp influxdb/influxdb-e2cb6c913a191e56c134e-data-1:/influxdb_test01_dump_out data/influxdb_test01_dump_out |
1 | kubectl get secrets -n influxdb # 看命名空间 |
1 | root@influxdb-e73f149ff7192bd87d190-data-1:/# influx -import -path='influxdb_test01_dump_out' -precision=ns -username='admin' -password='' |
-database
,把influxdb集群实例中所有数据库的数据导出,加 -compress
导出压缩文件-compressed
导入压缩文件,本质上是先解压后倒入1 | # 导出配置文件 |
1 | spec: |
1 | apps@(datamars)mhpl74337-10.20.248.65 ~$ kubectl get pv -n influxdb |
1 | kubectl apply -f influxdb-sts.yaml |
1 | apps@(datamars)mhpl74337-10.20.248.65 ~$ kubectl edit sts -n influxdb influxdb-e73f149ff7192bd87d190-data |
10.14-10.18:看文档,建立InfluxDB集群概念(前期已经也在看了..),建立整体框架概念(apiserver–bakserver–agent)
10.21-10.25:本地容器搭建influxdb集群×,连接服务器测试实例验证功能,了解K8S概念,手动验证实例(库级)导入导出即逻辑备份
10.28-11.01:对其需求(能做但没用户??),完成技术文档框架,开始将功能接入datamars-bakserver,了解golang开发
11.04-11.08:搭建go开发和agent项目环境,,无法理解go项目结构,尝试从bakserver侧理解task下发-接收-执行全流程
11.11:理解所有业务代码(after2weeks)发现task下发无需改动,只需适配influxdb(修改配置类和表),接着打包至sit环境打印log调试
11.12-11.15:研究pod添加container(改sts后delete pod重建),go项目构建(windows尝试配齐开发工具但有些包依赖linux环境)》。
11.18-11.27:本机wsl的ubuntu成功构建起datamars-agent,边抄边做,不用理解其框架?.. 及时请教专家
11.28-12.03:kun哥手改agent代码:)打包image push到dockerhub,宿主机拉取镜像后本地grpcurl调试 pod ip:port 验证功能
12.04-12.09:bakserver打日志流水线部署到uat(集群实例所在环境),通过apiserver-bakserver-agent中的日志验证全流程功能
12.10:验证通过
技术文档先行,将需求拆分成一步步,重要的是要有产出,,能汇报进度。。buffer。。好心态😇不怕叼
关注重要的事情(功能接入已有框架/理解业务逻辑×,功能验证和对齐需求√,开发卡点及时请教)
1/2时间幻想(串联已知信息且验证,对齐上下游并重复验证,本质是开发环境,业务不熟悉),1/4等回复(线上下请教+准备),1/4开发(快乐短暂)
与人沟通是重要的能力。。拉群问。。软件开发还是很残酷的。。
2025.04:重新考虑… 1 influx_inspect export只是把该pod指定数据库(或所有库)的指定时间段的分片数据(tsm&wal)导出line protocol文件,各Data-Pod数据不一致时不能代表整个实例;2 influx -import本质是将数据重新写入,前提要先恢复好shard元数据,,
1.02:不上心
1.14:开发uat自测(sit没测)完成,开发分支合dev提测,最后合main上线
1.16:SD/GA测试发版失败,恢复工作流需要人工介入验证,存在问题 1地址没有动态配置!! 2漏配接口/审批流变更
1.21:发布修复版本,生产延后
复工
当前阶段的关键,,交付能力,,工程能力是练出来的
熬夜是没有对明天的期待、、-》培养兴趣转移注意力、,books
程序员。技术。不要只看自己的一亩三分地。。开源项目
工作以外;:给自己创造需求,根据需求解决问题,在解决问题上配合看书,,从而在某一细分领域有知识图谱,有一技之长,用系统性的看书代替cdsn查找零散的解决方案
“下班的时间放在哪哪里就有提升”
副业?;web3;licai
todo 手画图
2.6-2.16:现有InfluxDB集群实例(只考虑data节点)的CPU、内存和存储资源已无法满足需求,需对资源配置进行扩展,以提升性能和稳定性。通过修改StatefulSet中cpu、memory配置并删除Pod触发StatefulSet控制器重建data节点Pod以应用新配置,通过修改data节点Pod对应的pvc中storage配置以触发pv的存储扩容(只能增加),实现资源变配(本地变配)
2.17:前端对齐开发,准备进入sit联调
2.18:插入需求“meta节点自定义创建”
2.28:整合已知信息已读代码->无法理解多节点类型实例如何发起变配,应该果断求助
3.3-3.10:改造influxdb集群为父子实例模式,改配置,传参调试,适配已有功能,考虑存量实例的影响
3.11-3.13:data变配基础上开发meta变配,云管订单遇到配额不匹配问题,上线延期下周
3.14:跨团队求助无果,请求协助,,新需求着手开发
3.17:搁置,开发新需求
3.18:实操tidb复现该“问题”,考虑转向与云管沟通。。
3.27:发版 =》InfluxDB父子实例改造/本地变配/节点/实例重启
正畸, 启动
读书时无所事事的日子,今天拔完牙和妈妈一起冰敷等待的日子,还有多少
刚开始普遍很难,易的是背八股,难的是落实和推进
如何跳出这个困境?如何跳出程序员行业?30岁,35岁
熬夜是因为没有对明天的渴望。但是在晚上的当下,有很多事情想做😿
喜欢一个人独处,是因为不想自己长期以来形成的情绪稳定被打破。害怕形成亲密关系,有时无法融入团体😿
2.18:本需求作为其他需求开发的前置条件
2.19:apisever打log上uat调试创建流程,从已部署分支git branch新分支以免影响正在使用者
2.21:提sql变更 1 dataspace提工单 2 直接进入各环境metadb(其本身为容器部署的mariadb服务) 3 某些配置项可通过datamars控制台修改
2.25:云管运营端商品信息变更,考虑是否影响存量实例;;1 云管释放旧实例将计价报错->调datamars管控接口释放/发版前释放旧实例 2 可以发起工单但无法下单->手动修改配额发起工单后过云管审批
2.27:发版流程、、代码合master,流水线打包使用(发版版本)部署,sql变更(定时,增加条件避免误订正),云运营变更(改一次console-cloud即各环境共用)
Steven👨🦲:裁员,残酷,危机感,,工作就是生活的很大一部分
deepseek:数据库方向是一个值得长期投入的领域,尤其适合对系统底层感兴趣的程序员。你的现有经验(运维+K8s)可成为切入云数据库或分布式数据库的跳板。建议以“运维需求驱动内核学习”为短期目标,逐步掌握分布式一致性、存储引擎等核心技术,同时通过开源贡献和项目实践构建技术影响力。=> https://yuanbao.tencent.com/bot/app/share/chat/c6b48985efa0c1101e5c6ae18c867724
rong teng:在midea得到的成长是显著的;(身兼开发运维多职,具体求职情况如何?)数据库方向有些窄;(作为senior求职需要专精时显得窄?作为基础能力学习可行?)应届生可以提转方向,转团队;以招聘市场心仪岗位的需求作为努力发展的方向!?
代码可以看作是一种特殊的prompt,用于引导AI生成高质量的代码提示;开发者有目的地编写代码,实是为AI提供清晰的意图上下文。
代码补全 需要让AI理解意图;技巧 提供具体示例,遵循规范和语义化,规范注释;“内联对话”
代码对话 本地工程理解@workspace,RAG增强
最佳实践
todo 体验cursor
3.17:简单需求,父子workflow + k8s资源控制器
3.18:接口配置:接口信息查看mariadb已有的相同接口,其他信息参考influxdb自身的其他接口;前端联调完成
3.19:提测,发版:发版分支一周内进行 1 代码扫描-安全扫描 2 安全-软件成分-Web漏洞-灰盒,解决漏洞;代码仓库设置发版分支,史诗中关联所涉及仓库,检索其发版分支的扫描报告,手动关联web漏洞测试报告,质量门禁达标以通过安全卡点
1 | # 生成随机类名避免冲突 |
TEMP_JAVA="/tmp/${CLASS_NAME}.java"
)rm -f "$TEMP_JAVA"
)1 | System.out.println("USERNAME:" + username.trim()); |
1 | # 错误示例:初始方案采用`IFS`分割导致变量截断 |
1 | credentials=$(get_auth $1) # get_auth()动态生成java解密脚本并多行输出 |
1 | function select_data_pod() { |
方案 | 优点 | 缺点 |
---|---|---|
文件存储 | 实现简单 | 存在安全风险 |
环境变量 | 进程内可见 | 长度受限 |
标准输出 | 无持久化风险 | 需严格格式控制 |
网络传输 | 适合分布式 | 增加复杂度 |
本项目完整代码已开源,读者可通过GitHub仓库获取最新版本。在Kubernetes运维领域,通过灵活组合各类工具实现自动化,是提升效率的关键路径。
3.28:需求分析->将pod迁移到集群的另一个资源充足的node上,并且恢复数据以及集群功能(元数据)
3.31-4.1:存量实例问题处理,, 建议客户使用改造后的influxdb实例,存量实例释放/启停/重启等功能遇到问题 =》未考虑好适配
4.2-4.7:出方案 1 sts指定亲合度规则以在指定node重建pod和pvc 2 开源influxdb-cluster功能不完全支持,考虑从分片副本层面恢复数据
4.8-4.10:数据恢复的主要思路=》从健康节点的分片副本copy-shard恢复出迁移节点原有的所有分片副本,?质疑->恢复过程中健康节点的分片副本持续写入的增量数据能否恢复??
4.11:考虑创建第3个Data-Pod替代迁移节点(从仍健康的迁移节点上迁移数据)× ->应该认为原节点完全不可用(相当于节点重搭了)设计方案参考其他数据库产品;;
4.14:推方案不动..自验证copy-shard达到预期效果,但无法解答原理,,自测方式还需模拟实际场景,多线程写入。。
4.15:写bash脚本批量写,开多终端模拟多线程,分片副本达70M+大流量2000point/s写 =》copy-shard恢复出分片副本与健康节点持续写的副本md5值不一致,恢复副本export文件小,猜测丢失数据
4.17:InfluxDB Data节点迁移方案评审:先迁移后逐个恢复分片数据。已验证在分片副本大小70M、写入数据达2000point/s的情况下直接copy-shard会导致增量数据丢失,考虑在copy-shard前先执行truncate-shards截断热分片(集群中所有写入最新数据的分片,截断后关闭写入,变成冷分片),并在所有Data节点上创建该分片的新热分片副本,也就是在迁移节点上恢复了全部原有分片的新热分片副本,最新数据写入这个副本,然后再逐个从健康节点上的冷分片副本copy-shard恢复出分片的历史数据(迁移前分片副本原有的数据&迁移过程中未能写入的数据),该分片数据完全恢复;自测符合预期
4.18-4.21:开发。发现原checkPodRebuildReady接口有时不符合预期,执行influxd-ctl指令(硬写成String在代码中)有时失效(meta no leader..),经常需要手工介入。。
4.22:提测
4.23:InfluxDB开源版可靠性不确定,,社区版,单节点,,开发,值班暂停
官方文档 https://influxdb-v1-docs-cn.cnosdb.com/influxdb/v1.8/introduction/install/
开源influxdb-cluster源码 https://github.com/chengshiwen/influxdb-cluster
Data节点迁移方案
故障矩阵:
DBCLOUD开源DB报警群(实例),DBEngine告警群(机器),致命告警->数据库值班告警处理群,MariaDB/MySQL/MongoDB/PostgreSQL 常见问题,,
制定2025年度重点工作计划。
快速开发InfluxDB服务化需求,持续优化已有功能;深度熟悉开源数据库,确保提供稳定服务。对齐其他数据库产品,了解用户实际需求,多方面考虑设计方案。做好值班任务。
希望提升的1-3项核心能力项,计划如何提升。
1 深入技术栈学习。阅读InfluxDB源码,学习数据库架构设计,K8s应用课程等,掌握高频业务场景的原理和运维技巧。
2 高效合作开发的能力。在全面思考,明确需求后开始开发,遇到卡点快速解决。
面向未来1年的职业规划。
本岗位沉淀
在这个阶段希望提高自己的工程能力,能比较全面地思考设计方案,快速开发和交付需求;还应该具备产品侧思考的能力,对一个系统有深入的认知,能够独当一面,做到专精一个领域。
4.25-5.8:手动验证全流程+调通API,分阶段做,卡点及时同步到群聊.. 官网找接口文档/厂家提供,postPolicies接口参数调不好,就先手动设好用get查出来构造requestBody..
5.9-5.13:理清自动化接入和改造方案(先看一期代码,考虑接口和表能否复用),主动拉评审会议
5.14-5.16:开发及时理清需求原型和改造点,开发备份域配置管理界面
5.19-5.23:重难点=》作业平台下发备份客户端安装ansible脚本改造,根据传参when指定不同task,实现在target主机安装指定平台的client,expect实现交互式流程
5.26-5.29:NBU备份申请自动化开发,实现BackupNbuService(备份平台NBU涉及代码,构造RestTemplate调API);备份域配置“增删改查”,分页,模糊查询,@Transation处理先删后插/先改后改/先删后删。。延期->0605
6.3:自测=》页面上发起请求获得requestBody/通过postman调用本地起的后端服务,调试=》注释排查法/计算器debug
6.4:发sit,延期->0612;完善todo
6.5:自测,用户验收,ddl&dml(注意StringEncryptor加密的密钥随env变化!!) 发版,存在问题待完善
1 |
|
6.27:页面流程理解+看“申请”自动化代码->考虑改造点,找api,输出文档
6.30-7.4:需求对齐,减少开发量的机会,,对于依赖项的变更(healthCheck->ResourcePool-VirtualServer)采用“蓝绿发布”=》先增后删
7.5-7.9:开发完成
7.10-7.11:自测,前端发起一次请求F12取payload / 后端接口处打印入参 + 按需修改 =》构造入参,走通流程,只需关注新加的代码(无关逻辑如校验/审批代码可以先注释掉。。)
7.14:变更成功后回滚。。手动修改+提sql同步配置;思考=》是不是可以直接另提一次变更,或者另外提供回滚接口,,总之此时回滚和前一次变更已经没有关联
解析值。。序列反序列parse,,JSONNode,,
1 | log.error("查询VirtualServer信息异常:"+e.getMessage(), e); |
接手CMDB,, 做需求=》做系统
点击查看元宝的回答 https://yuanbao.tencent.com/bot/app/share/chat/920NVAbsqwtm https://yuanbao.tencent.com/bot/app/share/chat/SzQrsGlsuz88
1 | journey |
简历模块 | 平庸写法 | 高价值写法(量化+技术关键词) |
---|---|---|
项目经验 | 参与CMDB需求开发 | 主导CMDB数据模型重构,设计弹性CI架构,支持200+动态属性扩展,模型变更效率提升40% |
技术亮点 | 使用Spring Cloud开发API | 基于Quartz+Netty开发高并发自动发现引擎,单节点支持5000+设备/秒采集 |
业务价值 | 提升系统稳定性 | 通过拓扑影响分析模块,故障定位时效从30min缩短至5min,年止损运维成本200万+ |
💡 简历筛选口诀:“技术深度×业务影响”双突出——避免写“增删改查”,聚焦架构设计、性能优化、跨系统集成。
基于内地与香港金融平台的在线量化投资的数据原型系统的设计与开发__
摘 要 II
Abstract III
目 录 V
第一章 绪论
1.1 引言
1.2 研究背景
1.3 研究现状
1.4 课题来源及意义
1.5 论文结构
第二章 数据原型系统开发环境和工具
2.1 Python爬虫
2.2 Django框架
2.3 设计模式
2.4 前端开发框架
2.5 开源图形库 ECharts
2.6 本章小结
第三章 数据原型系统架构设计
3.1 综合性金融系统架构设计
3.2 数据原型系统架构设计
3.3 功能接口设计
3.4 数据库设计
第四章 数据原型系统的实现
4.1从金融平台获取数据实现
4.2 数据库查询实现
4.3 数据可视化实现
4.4 Echarts 图形库渲染生成统计图表
4.5 数据下载接口实现
4.6 数据维护接口实现
第五章 数据原型系统的测试及结果
5.1 数据更新模块测试
5.2 数据下载模块测试
5.3 数据分析模块测试
5.4 数据维护模块测试
5.5 本章小结
第六章 结论
1.论文工作总结
2.工作展望
参考文献
致谢
1 | class CreateDatabase: |
1 | class Database: |
1 | # 获取期货列表:东方财富网今天期货市场中港交所的期货列表信息(??不确定是不是完整期货信息) |
1 | # 获取历史期货数据:通过之前获取的期货列表信息,根据期货代码获取其历史(日线)数据(??不确定完整) |
股票代码 | 股票名称 | 最新价 | 涨跌额 | 涨跌幅 | 今开 | 最高 | 最低 | 昨收 | 成交量(股) | 成交额 | 更新日期 |
---|---|---|---|---|---|---|---|---|---|---|---|
code | name | now | change | changerate | open | high | low | yesterday_close | volume | amount | date_updated |
code | date | open | now | high | low | volume | amount | rate | changerate | per | zero |
---|
名称 | H股代码 | 最新价(HKD) | 涨跌幅 | A股代码 | 最新价(RMB) | 涨跌幅 | 比价(A/H) | 溢价(A/H)% | 更新时间 |
---|---|---|---|---|---|---|---|---|---|
name | code_hkd | now_hkd | changerate_hkd | code_rmb | now_rmb | changerate_rmb | AHcomparison | AHcomparisonrate | date_updated |
1 | class HKStockIndexinfo(models.Model): |
1 | python manage.py makemigrations # IDE console |
1 | <thead> |
1 | def hkstockindexinfo(request): |
1 | urlpatterns = [ |
1 | PS E:\Code\datasite> python manage.py runserver |
1 | class HKEXMainBoardhistory(models.Model): |
1 | python manage.py makemigrations # IDE console |
1 | {% load static %} <!-- 在项目setting.py配置:STATIC_URL = '/static/' --> |
1 | def historyklines(request): |
1 | urlpatterns = [ |
1 | PS E:\Code\datasite> python manage.py runserver |
1 | def hkexmainboarddata(request): |
1 | <div class="card "> |
毕业答辩的意义是,校方为了进一步的审查论文。
考查内容可归纳如下:①进一步考查和验证毕业论文作者对所着论文论题的认识程度及当场论证论题的能力 ②进一步考查毕业论文作者对专业知识掌握的深度与广度 ③审查毕业论文是否学员自己独立完成
答辩时提问依据:①汇报PPT的内容 ②毕业论文的内容 ③汇报者的言语
答辩日期:5月24日(13周周五),上午1-4节,8:50开始,预计到中午左右结束;
答辩地点:A4206
需携带资料:
1.答辩ppt 电子版(u盘);2.一式3份双面打印的论文(最新版,不需要装帧封面)。
注意事项:
1.请大家提前半小时(上午8:20)到现场,调试好设备(电脑、投影仪、麦克风,等),所有的ppt都拷贝到指定电脑上(可以用课室的电脑,但建议至少带一台笔记本做备用)。
2.提前打印好3份毕设论文(简单的双面打印即可,不需要特别装帧封面,因为不是最终稿),答辩前统一交给老师翻阅。如果在答辩前对论文有修改,和提交系统的版本不一致也没关系,只要打印最新版就可以了。
3.每人答辩陈述时间5分钟左右(可以利用powerpoint的排练功能提前排练好),然后留3分钟左右回答老师的提问。
4.回答问题时要认真记录下老师提出的修改意见,并在答辩结束后按要求修改论文,然后提交论文最终版到维普系统;
5.答辩结束后,老师们会在维普系统上给论文和答辩过程打分,大家把论文最终版提交维普系统之后,可以直接从系统上下载并打印带有老师电子签名的各类表格(一般不需要找老师们手签)。最终版论文一定要装帧好封面,和全套打印的表格一起,按照顺序放入档案袋并交给导师。
各位评委老师,同学们:
大家上午好! 我是网络工程专业的蔡枫,我的论文题目是基于内地与香港金融平台的在线量化投资的数据原型系统的设计与开发。
<翻页>
今天我将从以下四个方面阐述我的毕业论文内容。
<翻页>
随着在线量化投资的普及,如何有效地收集和整理海量的互联网金融数据,成为了一大挑战。
<翻页>
一方面,互联网数据具有实时性,导致用户和金融公司都难以检索过去特定时间的完整金融数据。
另一方面,人们需花费大量时间在门户网站浏览实时金融信息,但缺乏明确直观的数据分析结果。
<翻页>
为有效解决以上问题,本论文设计并开发了基于网络爬虫的数据原型系统,实时获取互联网上的金融数据,并提供数据下载的功能。
另外,系统提供了数据可视化和数据分析的功能,用户能够从中获取具有参考价值的信息。
以及,作为综合性金融系统中的底层数据平台,能够为其他模块的开发提供数据源。
<翻页>
<翻页>
首先介绍一下网络爬虫,其通过模拟人类浏览网页的行为,获取并解析网络信息。
<翻页>
如果目标网站提供了 API 接口,我们可以通过浏览器的开发者工具进行抓包,并在Python项目中直接调用以获取数据。
<翻页>
系统的开发语言为 Python,采用 Django 框架结合前端技术进行 Web 应用的构建。通过编写 MTV 三层架构代码,开发子系统的各功能。
<翻页>
本系统中选择 MySQL 作为数据库,存储爬取到的网络金融数据,以及进行后续的功能开发。
<翻页>
本系统的数据库中主要有两种表,即各类港股基本信息表和港股历史数据表。
<翻页>
在港股基本信息表中,包括股票代码、股票名称、最新价、涨跌额等基本信息,另外还添加了 date_updated 字段,以便在更新历史数据表时计算出所需更新数据的时间段。
<翻页>
在港股历史数据表中,保存了表示K线数据的相关字段。
<翻页>
<翻页>
本文的数据原型系统是作为综合性金融系统底层的数据平台模块进行开发的,其他的量化因子分析模块和量化投资策略模块由小组成员负责开发。
<翻页>
在底层的数据平台,即本文的数据原型系统中,保存了香港金融市场股票的交易数据,包括了数据库建设模块、数据可视化模块、数据接口模块、数据分析模块这四个模块。
<翻页>
在数据库建设模块中,主要有三个程序,分别用于创建数据库和表,初始化表数据,以及更新表数据。
其中更新程序是利用 schedule 库,设置定时任务16点实时更新数据到各类港股基本信息表中,根据基本信息表中的的股票代码和更新时间,获取其自更新时间至今的K线数据添加到对应的表中同时修改“更新时间”为当日,以及定期对表执行“转储SQL”操作进行数据备份,以便在需要时快速重构。
<翻页>
在数据可视化模块中,提供了基本信息表格功能。点击子系统导航栏,选择港股类型,在子系统界面上对应的基本信息数据。
<翻页>
实现的基本步骤为:编写模型与数据库表映射,编写视图接收请求和模版页面,并配置好请求访问路径,即可通过浏览器访问系统功能。
<翻页>
另外,提供了历史数据K线图展示功能,根据前端输入的各类港股股票代码,从数据库中获取数据,并利用 ECharts 生成历史数据K线图。
<翻页>
其实现步骤类似前面介绍的基本信息表格。
<翻页>
在数据接口模块中,复用了历史数据K线图功能的功能界面和业务代码,根据输入的各类港股股票代码,从数据库中对应的历史数据表中获取数据,以JSON形式返回到新标签页面上。
<翻页>
数据可以供综合性金融系统中的其他模块使用,用户也可以在页面上右键“另存为”下载数据文件。
<翻页>
最后是数据分析模块:对于采集的金融数据作进一步的分析,呈现更直观和更有价值的信息。我们另外爬取了内地市场沪深京A股的数据,对比分析凸显港陆市场的数据差别。
<翻页>
首先,对于港股与沪深京A股,计算基本统计描述。
<翻页>
可以简单分析看出,香港市场在股价波动性和交易量方面普遍较大,呈现出更高的市场活力和波动性;
内地市场的平均股价虽然较低,但交易量和交易金额却相对较高,显示出更为稳定的交易情况。
<翻页>
然后进一步进行各类数据的可视化分析。我们进行了收盘价分布统计,这是放大后。。
<翻页>
然后是涨跌幅分布比较。。
<翻页>
<翻页>
本次毕业设计的工作涵盖了搭建数据原型系统的各个方面,包括金融数据库的设计、系统前端和后端的开发等。
(数据采集:直接从东方财富网接口获取金融数据,并通过数据清洗和整理存储到数据库中。在开发时使用了大模型进行数据含义的分析和编写数据清洗代码,极大地提高了开发效率。对于前端的编写,同组的同学提供了模板,为开发带来了很大的便利。只需开发子系统功能界面,将模板页面中空缺内容区块覆盖。在系统后端的开发过程中,我快速学习了Django的开发流程,进行需求分析和功能设计后,解决实际开发问题,同时总结经验完善系统。)
同时,对于这几个方面,未来还有需要改进的地方。
<翻页>
对于这几个方面,未来也有需要改进的地方,如加强数据采集时对异常情况的处理,优化系统前后端性能等。。
(在数据采集方面,引入多线程实现对数据的并行处理,另外还需加强对异常情况的处理,确保系统稳健运行。在系统前端方面,进一步完善用户界面的设计和用户体验,考虑引入前端框架如React、Vue.js等,以提升前端开发的效率和灵活性,提供更加直观和友好的数据展示方式。在系统后端方面,不断优化系统架构和性能,加强对系统的监控和管理,及时发现和解决潜在的问题,确保系统长期稳定运行。)
<翻页>
最后感谢各位老师的聆听及指导,我的汇报到此结束。
微服务间通讯有同步和异步两种方式:
1、同步通讯:就像打电话,需要实时响应;
2、异步通讯:就像发邮件,不需要马上回复。
两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。
同步通讯
我们之前学习的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题:
同步调用的优点:
同步调用的问题:
异步通讯:常见实现是事件驱动模式
异步调用则可以避免上述问题:我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。
在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。
Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。
好处:
缺点:
MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。
比较常见的MQ实现:ActiveMQ,RabbitMQ,RocketMQ,Kafka。几种常见MQ的对比:
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 |
可用性 | 高 | 一般 | 高 | 高 |
单机吞吐量 | 一般 | 差 | 高 | 非常高 |
消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 高 | 一般 | 高 | 一般 |
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
MQ的基本结构:
RabbitMQ中的一些角色:
包括三部分:
简单队列模式的模型图:
官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:
1 | public class PublisherTest { |
1 | public class ConsumerTest { |
SpringAMQP 是基于 RabbitMQ 封装的一套模板,并且还利用 SpringBoot 对其实现了自动装配,使用起来非常方便。
SpringAMQP提供了三个功能:
在父工程mq-demo中引入依赖
1 | <!--AMQP依赖,包含RabbitMQ--> |
1 | spring: |
1 |
|
1 | spring: |
cn.itcast.mq.listener
包中新建一个类SpringRabbitListener,代码如下:1 |
|
Work queues,也被称为(Task queues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。
当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。此时就可以使用 work 模型,多个消费者共同处理消息处理,速度就能大大提高了。
1 | /** |
1 |
|
1 | spring: |
发布订阅的模型如图:
可以看到,在订阅模型中,多了一个exchange角色,而且过程略有变化:
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
这样,实现了一个消息发送给多个消费者。
在广播模式下,消息发送流程是这样的:
我们的计划是这样的:
1 | // 在consumer中创建一个类,声明队列和交换机 |
1 | // 在publisher服务的SpringAmqpTest类中添加测试方法 |
1 | // 在consumer服务的SpringRabbitListener中添加两个方法,作为消费者 |
在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。
在Direct模型下:
BindingKey
(路由key)RoutingKey
。RoutingKey
进行判断,只有队列的Bindingkey
与消息的 Routingkey
完全一致,才会接收到消息@RabbitListener
来声明队列和交换机:1 | // 消费者1+队列+交换机+BindingKey |
1 |
|
Topic
类型的Exchange
与Direct
相比,都是可以根据RoutingKey
把消息路由到不同的队列。只不过Topic
类型Exchange
可以让队列在绑定Routing key
的时候使用通配符!Routingkey
一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
通配符规则:#
:匹配一个或多个词;*
:匹配不多不少恰好1个词
举例:item.#
:能够匹配item.spu.insert
或者 item.spu
;item.*
:只能匹配item.spu
解释:
china.#
,因此凡是以 china.
开头的routing key
都会被匹配到。包括china.news和china.weather#.news
,因此凡是以 .news
结尾的 routing key
都会被匹配。包括china.news和japan.news1 | rabbitTemplate.convertAndSend(exchangeName, "china.news", message); |
1 |
.
分割#
:代表0个或多个词*
:代表1个词之前说过,Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。
只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:
显然,JDK序列化方式并不合适。我们希望消息体的体积更小、可读性更高,因此可以使用JSON方式来做序列化和反序列化。
在publisher和consumer两个服务中都引入依赖:
1 | <dependency> |
配置消息转换器。在启动类中添加一个Bean即可:
1 |
|
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。优点:架构简单、部署成本低。缺点:耦合度高,扩展性差,适合小型项目。例如:学生管理系统
分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
分布式架构的要考虑的问题有:服务拆分粒度如何?服务集群地址如何维护?服务之间如何实现远程调用?服务健康状态如何感知?
微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。在国内最知名的就是SpringCloud和阿里巴巴的Dubbo(升级SpringCloudAlibaba(实现了SpringCloud接口,是SpringCloud的一部分))微服务技术对比:
企业中常见的四种需求:
SpringCloud 是一个基于 Spring Boot 的开源框架,旨在简化构建分布式系统中的微服务架构。它提供了一系列工具和库,用于实现微服务架构中常见的模式和功能,如服务发现、负载均衡、配置管理、断路器模式、消息总线等。
SpringCloud 集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:
对于 SpringBoot 的版本要求
1 | String url ="http://userservice/user/" + order.getUserId(); |
1 |
|
内置负载均衡规则类 | 规则描述 |
---|---|
RoundRobinRule | 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule【默认】 | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 重试机制的选择逻辑 |
1 |
|
1 | userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务 |
1 | ribbon: |
startup.cmd -m standalone
父工程添加 spring-cloud-alibaba 依赖;微服务项目引入 nacos.discovery 依赖,yml 配置 nacos 地址 spring.cloudnacos.server-addr
Nacos 是 SpringCloudAlibaba 的组件,而 SpringCloudAlibaba 也遵循 SpringCloud 中定义的服务注册、服务发现规范。因此使用 Nacos 和使用 Eureka 对于微服务来说,并没有太大区别。
<dependencyManagement>
中引入SpringCloudAlibaba的依赖;1 | <dependency> |
1 | <dependency> |
1 | spring: |
1 | private final DiscoveryClient discoveryclient; |
一个服务可以有多个实例,例如我们的user-service,可以有:127.0.0.1:8081,127.0.0.1:8082,127.0.0.1:8083
假如这些实例分布于全国各地的不同机房,例如:127.0.0.1:8081在上海机房,127.0.0.1:8082在上海机房,127.0.0.1:8083在杭州机房。 Nacos就将同一机房内的实例 划分为一个集群。
1 | spring: |
ZoneAvoidanceRule
并不能实现根据同集群优先来实现负载均衡。因此Nacos中提供了一个NacosRule
的实现,可以优先从同集群中挑选实例。1 | userservice: |
默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题。因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
在nacos控制台,找到user-service的实例列表,点击编辑,在弹出的窗口修改权重:(注意:权重为0,则该实例永远不会被访问)
Nacos提供了namespace来实现环境隔离功能(比如把一些功能紧密的服务隔离在一起,不能被另一些服务访问)
1 | spring: |
Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:
1 | cloud: |
Nacos除了可以做注册中心,同样可以做配置管理来使用。
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
1 | <!--nacos配置管理依赖--> |
1 | spring: |
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
作为文件id,来读取配置。本例中,就是去读取userservice-dev.yaml
:1 | package cn.itcast.user.config; |
[spring.application.name]-[spring.profiles.active].yaml
,例如:userservice-dev.yaml[spring.application.name].yaml
,例如:userservice.yaml[spring.application.name].yaml
不包含环境,因此可以被多个环境共享。下面我们通过案例来测试配置共享:Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送;
解决从前利用 RestTemplate 发起远程调用代码中的问题:1、代码可读性差,编程体验不统一;2、参数复杂URL难以维护
OpenFeign是一个声明式的http客户端,是SpringCloud在Eureka公司开源的Feign基础上改造而来。其作用就是基于SpringMVC的常见注解,帮我们优雅的实现http请求的发送.
1 | <dependency> |
1 | <!-- 负载均衡?? --> |
@EnableFeignClients
注解 开启Feign的功能:@FeignClient
注解,内容如下:1 |
|
Feign可以支持很多的自定义配置,如下表所示:
类型 | 作用 | 说明 |
---|---|---|
feign.Logger.Level | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
feign. Contract | 支持的注解格式 | 默认是SpringMVC的注? |
feign. Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |
一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的@Bean覆盖默认Bean即可。
自定义配置的两种方法:
Feign 是一个声明式客户端,只是把声明变成 http 请求,底层还是发http请求,依赖于其它的框架。
其底层客户端实现包括 URLConnection:默认实现,不支持连接池;Apache HttpClient:支持连接池;OKHttp:支持连接池。因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。用Apache的HttpClient来演示:
1 | <!--httpClient的依赖 --> |
1 | feign: |
所谓最近实践,就是使用过程中总结的经验,最好的一种使用方式。
如果一个微服务需要重复被其他微服务调用(消费),那么每个消费者都要重复编写一个 client。有没有办法简化这种重复的代码编写呢?
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
Gateway网关是我们服务的守门神,所有微服务的统一入口。前端只需要知道网关的端口,发送请求就行了。
架构图:
网关的核心功能特性:
在SpringCloud中网关的实现包括两种:gateway、zuul
1 | <!--网关--> |
1 |
|
1 | server: |
Path
规则的一切请求,都代理到uri
参数指定的地址。本例中,我们将 /user/**
开头的请求,代理到lb://userservice
,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
例如Path=/user/**是按照路径匹配,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory
类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个:
名称 | 说明 | 示例 |
---|---|---|
After | 是某个时间点后的请求 | - After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before | 是某个时间点之前的请求 | - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between | 是某两个时间点之前的请求 | - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | 请求必须包含某些cookie | - Cookie=chocolate, ch.p |
Header | 请求必须包含某些header | - Header=X-Request-Id, \d+ |
Host | 请求必须是访问某个host(域名) | - Host=.somehost.org,.anotherhost.org |
Method | 请求方式必须是指定方式 | - Method=GET,POST |
Path | 请求路径必须符合指定规则 | - Path=/red/{segment},/blue/** |
Query | 请求参数必须包含指定参数 | - Query=name, Jack或者- Query=name |
RemoteAddr | 请求者的ip必须是指定范围 | - RemoteAddr=192.168.1.1/24 |
Weight | 权重处理 |
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
名称 | 说明 |
---|---|
AddRequestHeader | 给当前请求添加一个请求头 |
RemoveRequestHeader | 移除请求中的一个请求头 |
AddResponseHeader | 给响应结果中添加一个响应头 |
RemoveResponseHeader | 从响应结果中移除有一个响应头 |
RequestRateLimiter | 限制请求的流量 |
需求:给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
1 | # 只需要修改gateway服务的application.yml文件,添加路由过滤即可 |
1 | spring: |
1 | public interface GlobalFilter { |
1 | // 过滤器优先级 |
1 | spring: |
https://leo710aka.github.io/2024/01/11/RabbitMQ/