今天分享组织内部的朋友在面试的时候遇到的几个典型的问题【项目规模、分库、分表】,分享一下我给他出的回答思路,大家也可以学习一下:
我们的医疗区块链系统采用混合云架构,在阿里云和自建数据中心部署。整体集群规模达到 80 个节点,分布在华东、华北两个区域中心。
部署内容包括:
部署方式采用 Kubernetes 容器编排平台,通过 Helm Charts 实现应用的自动化部署和管理。所有服务都打包为 Docker 容器,遵循 CI/CD 流程,从代码提交到生产环境部署全程自动化。
节点和服务器数量的判断依据主要有:
例如,通过性能测试发现单个原材料数据处理节点每分钟可以处理 8000 条 IoT 数据,而我们的业务需求是每分钟处理 5 万条数据,同时考虑 30% 的冗余,因此部署了 8 个处理节点。
我们采用按业务域和数据访问模式相结合的分库策略,主要基于以下维度进行划分:
例如,原材料库按照品类和区域分为:
每个库的核心表结构是一致的,但会根据区域特性添加少量区域专属字段。每个库包含约 15-20 张表,主要包括:
查询某个库的数据通过服务路由实现:
库与库之间的隔离通过以下方式实现:
我们采用水平分表策略,主要基于以下键进行分表:
每张表的数据量控制在 500-800 万条记录,以保证查询性能。例如:
分表策略带来的优势:
使用场景:
主要好处:
区别:
特性 | context.Context | sync.WaitGroup |
|---|---|---|
核心功能 | 传递请求范围的数据、取消信号和截止时间 | 等待一组 goroutine 完成 |
数据传递 | 支持跨 goroutine 传递键值对数据 | 不支持数据传递 |
取消机制 | 支持主动取消和超时取消 | 不支持取消,只能等待所有任务完成 |
使用场景 | 请求作用域的数据、超时控制、取消信号 | 等待多个并行任务完成后继续执行 |
适用场景:
在 Go 语言中,context.Context的取消操作是通过WithCancel、WithTimeout和WithDeadline三个函数实现的。这些函数都会返回一个可取消的Context和对应的CancelFunc,调用CancelFunc即可触发取消操作。
取消机制的工作原理:
Context时,系统会在后台维护一个取消信号的传播链CancelFunc时,会向该Context及其所有子Context发送取消信号Context的select语句中的<-ctx.Done()分支会立即被激活适用场景:
微服务实现方式:
在 Go 语言里,空指针(也就是nil指针)会引发运行时错误,像panic。下面为你介绍空指针出现的情形以及相应的避免方法。
nil。要是直接解引用这样的指针,就会触发panic。nil指针:某些函数在特定条件下可能会返回nil指针,要是调用方没有检查返回值就直接使用,就容易引发panic。nil接口调用方法:当接口变量的值为nil时,调用该接口的方法会导致panic。nil,不过它们的使用规则有所不同。比如,向nil映射存入键值对会引发panic,而向nil切片追加元素则不会。new函数来实现。nil指针的函数后,要先确认返回值是否为nil,然后再进行后续操作。nil,以此避免空指针问题。nil。nil的问题。避免 Go 语言中的空指针问题,关键在于养成良好的编程习惯,例如使用前初始化指针、检查返回值、合理运用零值对象等。同时,要理解指针、接口和集合的零值特性,防止对nil值进行非法操作。
消息中间件选型策略: