在有一定Go语言基础之后(Go语法的笔记先咕咕咕,我觉得还有一部分需要再整理一下),青训营分别排了三门课程分别介绍了存储与数据库、gorm、中间件之消息队列,以前基本上没怎么接触过这部分的知识。
存储与数据库
存储系统&数据库简介
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。
可见存储系统目的是持久化,要求是安全有效。它是性能敏感的,且容易受硬件影响。
考虑到以上的情况,
- 性能敏感 -> 善用缓存,减少拷贝
- 硬件影响 -> 统一接口
- 安全有效 -> RAID(Redundant Array of Inexpensive Disks)
为什么要单独把数据库拆分出来呢?难道数据库和存储系统不一样吗?这一部分我想CMU-15445的第一课给出了很好的答案,在扁平的文件系统存储的基础上,新增了更多的需求:
• Efficiency. Need to scan the entire file and store in memeory to find a particular record.
• Flexibility. Hard to do schema change, i.e., add a new field. Need to rewrite the entire file.
• Data Integrity. Hard to enforce constraints, e.g., year has to be a number. Also it is possible to reference a non-existent artist in the album file.
• Durability. What if the machine crashes while our program is updating a record?
• Concurrency. What if two threads try to update the same record at the same time?
• Abstraction. The program is tightly coupled with the physical storage (CSV file).
为了解决这些问题,后续课程介绍了一系列数据库相关的技术。
主流产品剖析
- 单机存储:文件系统、Key-Value
- 分布式存储:HDFS、Ceph
- 单机数据库:关系型 Oracle、Postgres、MySQL,非关系型ES、MongoDB、Redis
- 分布式数据库:解决容量、弹性、性价比问题。
ORM
首先是要会database/sql包的基本使用,以及搞清楚为什么要import _————需要调用init函数注册驱动。
也要注意可以通过go-sql-driver/mysql的NewConnector接口来新建连接,我感觉这个应该是更好的选择。
ORM的话,知道增删改查的基本操作就好,来自课上的ppt。
高级特性好像没有接触过,听得云里雾里的,或许以后能接触到。
还有就是gorm怎么拼SQL的,知道了一点大概(记不太清了),印象中是为每个clause实现一遍拼接的函数吧,然后finish method加一层query。
中间件之MQ
这节课主要就是讲了消息队列。处理速度跟不上客户需求,所以需要加点缓冲。(在某个不知名群里面窥屏看到的)
主要就是为了:
- 业务解耦
- 流量削峰
- 异步处理
- 日志处理
对消息队列就有要求: 高吞吐、高并发、高可用。 介绍了三种消息队列:
- Kafka
- BMQ
- RocketMQ
PPT做的很详尽,但是可惜没有相关接触,感觉还是缺少一点感觉