作者ybite (小犬/小B)
看板Soft_Job
标题Re: [请益] 後端工程师除了CRUD之外还要精进什麽?
时间Sun Jun 3 01:37:03 2018
随便试着写一下考卷 赚个P币
※ 引述《taliao (云淡风清)》之铭言:
: 有趣的问题,来一些激荡吧~
: Q: 你怎麽知道 CRUD 分别吃多少系统资源?需要多少 IOPS / CPU?
: Q: 承上,要如何知道 CURD 吃了哪些资源?
: Q: 承上,怎麽解开这些资源的分配问题?
其实这题超难回答。实务上会分为 Script 所吃的资源跟储存对象所吃的资源。
Script 来说 Python/Ruby/Node.js 等每个 Process 都会吃到 CPU + 记忆体
储存对象除了 CPU 跟记忆体之外也会吃到 Disk I/O。
当你做 Create 的动作时,Script 端会需要用 CPU 跟记忆体去运算逻辑
把插入的指令传给资料库,资料库除了 CPU 运算,以及将资料写入磁碟的 I/O 外
还会视资料库的索引跟快取优化去做其他优化的记忆体/磁碟 I/O 运算
因此一个准确的 IOPS/CPU 不太容易得出,但是我们可以透过系统监测
透过实质的 CPU、记忆体、I/O 使用率去得到系统大致的运转状态
并使用资料库系统的 EXPLAIN 得知储存上的瓶颈点
: Q: 1 个连线的 CRUD、10 个连线的 CRUD、100 个的 CRUD ..... 类推,
: 他们的架构是怎样?
很简单的 CRUD
1 个连线
1个实体 =============== DB
实务上的 CRUD 架构
Load balancer -- A XX个实体 == 连线 Pool == DB with sharding
-- B XX个实体 == 连线 Pool ==
-- C XX个实体 == 连线 Pool ==
-- D XX个实体 == 连线 Pool ==
: Q: CRUD 的对象是 RDBMS? NoSQL? Block Storage? Cache? Buffer?
: Q: 承上: CRUD 的对象怎麽选?我只会 MySQL 啦,都往里面塞就是了 .....
这题每个人答案应该都不一样,以下是我个人见解。
Block Storage 跟 Buffer 我不知道他想表达什麽,先 Skip QQ
RDBMS 解决问题的方式是透过表格与关联,复杂的查询可以透过 JOIN 关联解决。
通常适用於大多数的使用情境,但需要定义固定 Schema 是一个考量点。
NoSQL 要视其使用的资料结构和分散式储存的策略来选择
严格说来某些 Cache (e.g. Redis) 甚至都可以算是一种 NoSQL 了
你需要储存简单的资料结构就可以塞在 Redis
你需要一个给我 JSON 内容我就可以塞进去的储存空间就可以用 MongoDB
: Q: 前端怎麽知道 CRUD 瓶颈在哪?
最烂的答案:开发者工具,看哪一个 Request 吃掉最多秒数......
: Q: CRUD 的操作对象,不管是 RDBMS, NoSQL, Storage, Cache,
: 瞬间流量冲进来怎麽处理?会遇到什麽问题?
: Q: 线上的系统 CRUD 出问题了,怎麽知道哪里出问题?
就像连假高速公路塞车一样,一超出设计极限,哪边就会炸掉
这个时候就要找出系统的瓶颈点,试着去一个一个解决问题
首先你 Script 的执行实体够不够多?不够的话就会塞在最前面
这个时候的症状是你的 QPS (等待人数) 很多,但你的柜台开不够多所以塞住
这个时候就要打一个 Process Manager 让它 Spawn 好几个实体进去
如果柜台都开很多了,结果每一个柜台处理业务的时候都後台当住
这个时候就要思考 Storage 上是不是有瓶颈点
首先,在 DB 跟 Script 之间要不要做 Connection Pool
再来,你有没有优化资料库的 Query?哪些 Query 特别慢?
EXPLAIN 出来发现哪里有问题?要怎麽打 Index 或着重新设计结构来优化?
: Q: 当现有的架构要拆分的时候 (microservices),你的 CRUD 还是 CRUD?
我的猜测:严格说来还是 CRUD
只是本来单一架构中不同资料的互动,会变成不同微服务之间的沟通
: Q: 当系统是分散式的时候,CRUD ... 要怎麽办?
我不知道怎麽回答 QQ
: Q: 你的 CRUD 考虑的是 ACID or BASE? 还是这啥?
ACID 是传统 RDBMS 为了资料安全性做的保障
BASE 是 NoSQL 为了牺牲一部份保障换取更高效率或扩张性做的妥协
愿不愿意接受这个妥协要视服务本身的特性而定
如果你的资料量非常大,而且可以接受几微秒的资料不一致性,那 BASE 就可以了
: Q: 写十年的 CRUD 然後都做一样的事情?那中年一定失业。
: 但是可以处理瞬间百万 qps 的 CRUD,你中年一定很忙。
: 下一系列的 Q
: Q: 哪里有百万 qps 的系统啊?qps 是啥?
: Q: 当有的时候,你准备好了吗?
: Q: 台湾没有百万的 qps 啊,国外有,你准备好了吗?
: Q: golang 很屌,可处理百万 qps,是这样?node.js 不行?C# 不行?
: Q: 买一台 2048 core 的机器就可以搞定了,需要说那麽多吗? .....
: ....
其实我觉得任何程式语言处理百万 QPS,技术上只要机器够大就可以
但是你了不了解这个程式语言的特性,它能做什麽,怎麽优化它
才是一个长期而且可能没有尽头的学问
如果你的框架很大,如何优化记忆体使用?
你的程式语言是编译的还是直译的?如果是直译,直译器有没有 JIT?
记忆体如何管理/需不需要 GC?如何侦测 Memory Leak?
这些问题的答案会随你用的程式语言跟框架而不同
而同样的机器可以应付多少 Request per sec 也随技术上花了多少力气而不同
---
大概是这样,鞭小力一点 QQ
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.168.79.225
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1527961025.A.BC9.html
1F:推 locklose: 推 06/03 01:42
2F:推 dsilver: 推 06/03 02:01
3F:推 vn509942: 感谢分享 06/03 02:21
4F:推 bheegrl: 推分享 06/03 07:30
5F:推 handwu: 推 06/03 08:57
6F:推 showken: 推 06/03 10:16
7F:推 lds74: 推分享 06/03 10:30
8F:推 APTON: 推 06/03 12:06
9F:推 devilkool: 感谢分享 06/03 13:01
10F:推 Ekmund: 虽说是最烂的答案 但前端有什麽更好用的手段吗QQ? 06/03 14:40
11F:推 accessdenied: 前端可以学一下Jmeter了解怎麽做压力测试和统计分析 06/03 14:49
12F:推 ripple0129: 分散式CRUD是啥,还是单一资料库吧,不然consistency 06/03 19:05
13F:→ ripple0129: 处理起来要人命吧。多资料库也是按照商业逻辑来拆分 06/03 19:05
14F:→ ripple0129: 关联性。 06/03 19:05
15F:推 akito117: 推 06/04 00:56
16F:→ free112136: 前端用jmeter做压力测试?小弟愚昧,还请accessdenied 06/04 09:15
17F:→ free112136: 演示一下用jemter测"前端"的"压力"测试 06/04 09:15
18F:→ alan3100: saga pattern 如何在分散式系统实现trans或部分rollback 06/04 13:22
19F:推 accessdenied: @free哥你是要测浏览器的压力还是测backend的压力? 06/04 16:40
20F:→ accessdenied: 这篇在说後端喔!如何从前端测後端CRUD的压力,中 06/04 16:40
21F:→ accessdenied: 文去念念好吗?找碴也不用秀阅读障碍吧? 06/04 16:40
22F:推 free112136: 你回文自己说前端,是你不会说话还是我有阅读障碍就 06/04 18:51
23F:→ free112136: 看各位看官的心理那把尺喽 06/04 18:51
24F:推 accessdenied: 文章是「前端怎麽知道CRUD的瓶颈」这句话你有阅读 06/04 20:05
25F:→ accessdenied: 障碍吧?CRUD会发生在前端吗?文章也讨论从Request 06/04 20:05
26F:→ accessdenied: time判断了,你阅读能力这麽差一定是歪国人 06/04 20:05
27F:→ accessdenied: Jmeter就是一个end to end从前端来观测後端效能的工 06/04 20:06
28F:→ accessdenied: 具,麻烦月领30K的不要出来丢脸好吗? 06/04 20:06
29F:→ accessdenied: 300万和30K之间没有沟通频率好吗! 06/04 20:07
30F:推 free112136: 300万原来是这样崩溃的…你继续吧! 06/04 20:22
31F:推 accessdenied: 你也继续领30K吧...... 06/05 08:33
32F:推 wanlinlin: 推 06/06 08:01