存储、ORM与MQ | 青训营笔记

74 阅读3分钟

在有一定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/mysqlNewConnector接口来新建连接,我感觉这个应该是更好的选择。

ORM的话,知道增删改查的基本操作就好,来自课上的ppt。

image.png

高级特性好像没有接触过,听得云里雾里的,或许以后能接触到。

还有就是gorm怎么拼SQL的,知道了一点大概(记不太清了),印象中是为每个clause实现一遍拼接的函数吧,然后finish method加一层query

中间件之MQ

这节课主要就是讲了消息队列。处理速度跟不上客户需求,所以需要加点缓冲。(在某个不知名群里面窥屏看到的) 主要就是为了:

  • 业务解耦
  • 流量削峰
  • 异步处理
  • 日志处理

对消息队列就有要求: 高吞吐、高并发、高可用。 介绍了三种消息队列:

  • Kafka
  • BMQ
  • RocketMQ

PPT做的很详尽,但是可惜没有相关接触,感觉还是缺少一点感觉