技术阅读周刊第9️⃣期

127ae1a222101d8b7137837c57e922ba.png

技术阅读周刊,每周更新。

历史更新

  • 20231107:第五期

  • 20231117:第六期

  • 20231124:第七期

  • 20231201:第八期

美团技术博客十周年,感谢一路相伴 - 美团技术团队

URL: https://tech.meituan.com/2023/12/04/ten-years-of-meituan-technology-blog.html602cc5c922f88adfb5831e01053d10e3.png

美团技术博客更新十周年了,这个博客确实在广大开发者心中都是有口皆碑的;记得当初在这里看过 HashMap 的原理分析、动态线程池等技术;现在也有加到订阅列表里,有更新时会第一时间阅读

CompletableFuture原理与实践-外卖商家端API的异步化 - 美团技术团队

URL: https://tech.meituan.com/2022/05/12/principles-and-practices-of-completablefuture.html90223257708b4e39e3cbf0643da0a214.png

本文描述了美团对 API 做异步优化的过程,最终选择了 CompletableFuture 的过程CompletableFuture 使用起来的坑还是蛮多的,推荐大家都应该阅读下。

  • 明确知道自己的代码运行在哪个线程上,如果不传入线程池那就是公共的 ForkJoinPool 线程池,可能会有阻塞的情况;也可以直接传入自定义的线程池

  • 线程池循环使用可能会引起死锁,当 A 线程依赖于 B 线程的执行结果时,如果此时是同一个线程池,并且线程池已满,B 线程一直得不到机会执行,那 A 线程也无法运行,从而导致死锁。

  • CompletableFuture 的异常往往会被包装为CompletionException,所以最好是要异常工具类进行提取

public class ExceptionUtils {
    public static Throwable extractRealException(Throwable throwable) {
          //这里判断异常类型是否为CompletionException、ExecutionException,如果是则进行提取,否则直接返回。
        if (throwable instanceof CompletionException || throwable instanceof ExecutionException) {
            if (throwable.getCause() != null) {
                return throwable.getCause();
            }
        }
        return throwable;

没错,数据库确实应该放入 K8s 里!

URL: https://mp.weixin.qq.com/s/QJn6-EzPp7PXar-GdMITCA

虽然这是一篇软文,不过其中几个论据确实是有道理的。而 K8s 的控制器则是基于另一种思路:机器能做的事就不应该由人来做。通过 Operator,可以实现24 小时不间断地同步期望状态和实际状态,而这是用 Ansible 很难实现的,你用 Ansible 实现是想写个定时任务嘛?

  • 复杂度:

    • Sealos 提供了一键安装命令,有效降低其复杂度

  • 稳定性:

    • 一个良好的软件架构会不断提升和收敛其鲁棒性,并逐渐减少对人的依赖,比如使用 Oracle 的人喝茶时间一定比用开源 MySQL 的人喝茶时间多

  • 性能:

    • 而且,容器对数据库性能的影响几乎可以忽略不计,真正重要的是磁盘 IO 和网络带宽时延等因素。

目前市面上大部分云服务厂商所提供的数据库服务也都是跑在  kubernetes 中的。

deckarep/golang-set: A simple, battle-tested and generic set type for the Go language. Trusted by Docker, 1Password, Ethereum and Hashicorp.

URL: https://github.com/deckarep/golang-set40ca24cb3ae5cef99281d3589ee05609.png

一个泛型的 Go Set 库, 还提供了一些集合常用的操作工具,比如 Contains/Difference/Intersect 等函数。

已经被这些公司采用了:

  • Ethereum

  • Docker

  • 1Password

  • Hashicorp

// Syntax example, doesn't compile.
mySet := mapset.NewSet[T]() // T 是具体的类型

// Therefore this code creates an int set
mySet := mapset.NewSet[int]()

// Or perhaps you want a string set
mySet := mapset.NewSet[string]()

type myStruct struct {
  name string
  age uint8
}

// Alternatively a set of structs
mySet := mapset.NewSet[myStruct]()

// Lastly a set that can hold anything using the any or empty interface keyword: interface{}. This is effectively removes type safety.
mySet := mapset.NewSet[any]()

文章链接:

  • https://tech.meituan.com/2023/12/04/ten-years-of-meituan-technology-blog.html

  • https://tech.meituan.com/2022/05/12/principles-and-practices-of-completablefuture.html

  • https://mp.weixin.qq.com/s/QJn6-EzPp7PXar-GdMITCA

  • https://github.com/deckarep/golang-set

PS:最近也在更新视频号,也会有一些技术干货,动动小手帮主播点播关注5dcc7a6a0658a4b1d2c105cbc37526d8.jpeg

fbe73d0f1e349c9fd942f44b2fa2f0f4.jpeg

往期推荐

技术阅读周刊第第8️⃣期

五分钟 k8s 实战-滚动更新与优雅停机

五分钟 k8s 实战-应用探针

技术阅读周刊第第7️⃣期

升级到 Pulsar3.0 后深入了解 JWT 鉴权

d67518d7e2c50feea238dfdf6b2fd5ae.gif

点分享

bad7f2360a77bed0d5e84f6f2eb4af23.gif

点收藏

570cbb8bb53d363fcabe1732670c51ec.gif

点点赞

b3b395bc46fc644040c3092e0659b5ca.gif

点在看

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值