最近本风流才子重出江湖,不做朋友圈段子手,决定开始好好写文章了,大家好好看好好学吧!
近半年来收集了一系列大厂技术 blog,断断续续在小本本上写了一些笔记,是时候整理一下了,争取日更。
PostgreSQL 调参
原文链接
摘要:PostgreSQL 默认的配置并没有为应用做特殊的优化,然而有许多参数是有优化空间的,譬如:
shared_buffer
PostgreSQL 有两级缓存,自己的缓存 shared_buffer 和内核缓存。为了在什么烂机器上都能跑,shared_buffer 的默认值设的很小。调节 shared_buffer 会非常有效。推荐值是系统内存的 25%-
wal_buffers
WAL = write ahead log,预写式日志,From Wiki:在使用WAL的系统中,所有的修改在提交之前都要先写入log文件中。log文件中通常包括redo和undo信息。假设一个程序在执行某些操作的过程中机器掉电了。在重新启动时,程序可能需要知道当时执行的操作是成功了还是部分成功或者是失败了。如果使用了WAL,程序就可以检查log文件,并对突然掉电时计划执行的操作内容跟实际上执行的操作内容进行比较。在这个比较的基础上,程序就可以决定是撤销已做的操作还是继续完成已做的操作,或者是保持原样。
在这些日志被写入磁盘之前有这个 buffer,如果并发连接很多,可以调大
effective_cache_size
给 PostgreSQL 一个 disk caching 的估计,如果实际能使用的其实很大,然而估计值很小,那么性能就会受损失work_mem
可以用来 in memory sort 的内存大小,如果 query 经常有 in memory sort,可以优化maintenance_work_mem
预留来 VACUUM, RESTORE, CREATE INDEX, ADD FOREIGN KEY,ALTER TABLE 这种事的内存,调大可以优化这些任务synchronous_commit
2 中提到了 WAL,synchronous_commit 控制 commit 之前是否等所有的操作写进了 WAL,是一个性能上的取舍。checkpoint_timeout,checkpoint_completion_target
Issue 一个 checkpoint IO 代价很高,我们希望尽可能地 smooth,checkpoint_timeout 要尽量短,checkpoint_completion_target 如果我理解正确的话也要尽量短
用 React Native 开发 iOS 的得失
原文链接
优势:
- 开发效率高,Debug 容易。和开发 web 一样,修改之后刷新即可见,不需要编译,Chrome 里 F12 即可调试
- 不需要太多 ios 知识,React 的知识可以迁移过来
- Flex box,一个新的 css module: https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox 很好用
劣势:
- React library 升级太快,好多东西 break 了
- 因为太新,好多本该内置的功能却需要第三方 library 的支持
- 一些动画的坑
总结:It's worth it(不亏)!
Twitch 对 gRPC 框架的改造
原文链接
structured RPC 是好的,老鼠台的道友们之前想用 gRPC,后来发现有问题,原因如下:
- 缺少 HTTP 1.1 支持,gRPC 只支持 http2,但是现有很多的 load balancer 之类的只支持 http 1.1
- 生成的 runtime 过大,且有时候旧版 client 无法兼容新版 server,会 break 东西(我强烈怀疑他们是不是打开的方法不对)
- 生成的 runtime 过大,很难理解,有 bug 很难改
- gRPC 只支持 binary 的 payload,直接操作 binary 很不方便
最后老鼠台用 Golang 内置的支持 http 1.1 的 http server,json,以及 protobuf,重新写了一套系统:Twirp,实现了如下约定:
- The URL is
/twirp/twitch.users.email.EmailBoss/UpdateEmail
. - The HTTP Method is
POST
, because it’s alwaysPOST
. - The body of the message should be a protobuf
UpdateEmailRequest
. - The body should be encoded either in binary or in JSON.
- The request should have a Content-Type header set to either
application/protobuf
orapplication/json
, matching the encoding of the body. - The response body will be a protobuf
UpdateEmailResponse
, encoded in the same way as the request. - If there is an error, it will be JSON encoded, including a message and a standardized error code.
感想:有时候一个技术是好的,但是由于 infrastructure 跟不上,可能给你你也用不了……
Uber 使用 NLP 帮助客服处理 ticket
原文链接
随着 Uber 的发展,ticket 数量的增加,人工处理起来很困难了,Uber 实现了一套简单可行的 NLP 方法
- 对于每个用户的 ticket,使用 SVD 和 TF-IDF 提取特征
- 使用余弦相似性找出前 3 近似的见过的 ticket
- 将推荐结果返回给客服人员
感想:简单粗暴的办法,其实在工业界上可以满足一定的需求,并不需要炼丹