谈谈 Golang, 以及我走的一些弯路
mhr18 2025-04-30 18:09 20 浏览 0 评论
先奉上Echa哥一路来整理的go 学习资料《「转」go 语言实战笔记教程系列大纲汇总-值得收藏》希望对你有帮助。
在某乎上看到了这个问题, 还是挺有意思的. 撕哪个语言最好, 几乎是工程师当中最好的引战题目了. 今天我只想谈谈我是怎么看待 Go 的, 以及我走的一些弯路.
我是 2010 年在学校的时候了解到 Go 语言的. 当时的 Go 语言还是一塌糊涂, STW GC 是大家嘲讽 Go 语言的最佳标靶. 只要黑一句, Go 粉基本被噎得说不出话来.
我当时正想储备一门带并发编程模型的语言. 因为觉得未来 CPU 主频不再增长的情况下, 带并发编程模型的语言肯定是未来的主流. 是共享内存型语言强有力的竞争对手.
候选名单如下:
Erlang, Golang, Scala 搭配 Akka.
首先 Scala 被我排除掉了, 因为 Akka 的实现我觉得并不好, 而且当时 Scala 并没有本质上的重量级应用 ( Spark 虽然在 2010 年开源了, 但是真正流行起来要到2012年后了 ). 其次就是 Go 和 Erlang 了.
当时我对 Erlang 非常痴迷, 因为 Erlang 是唯一一个实现了软实时调度器的编程语言. 这意味着这东西可以直接用来写电话交换机 ( 当然 Erlang 诞生之初也是为了这个目标而存在的 ), 而如果要用Go来写电话交换机, 很可能会电话打着打着, 碰到了 STW GC, 然后你就听不到电话对面在讲什么了 ( 这也是为什么后来 WhatsApp 用了 Erlang, 50 个工程师写出了支撑 9 亿用户的系统 ).
而且, Erlang 实现的系统, 做到了 9 个 9 的可用性. 这是什么概念? 这意味着全年停机时间不超过 31.56 毫秒. 几乎就是不会停机了. 阿里云都只能说自己的可靠性 6 个 9, AWS 的可用性只有 99.95%. 意味着每年要停机 4.5 小时左右.
Erlang 另外一个设计的好的地方是, 它本身的 runtime 与其说是虚拟机, 不如说是操作系统, 是个运行时容器. 要知道 BEAM ( Erlang 虚拟机的名称 ) 在1992年就被实现了. 而 Docker 2013 年才出现. 这是多么超前的理念.
于是我义无反顾的学了 Erlang, 而 Golang 我只是看了看语法, 写了几个 demo, 观望了下.
时间来到了 2012年, 我去 360 搜索实习. 我被分配的一个任务就是写一个监控程序, 实时收集并展示 nginx 的连接数等状态, 做数据可视化供运维工程师调度机器参考. 机器的数量非常多, 并且要实时展示, 这算是个难点. 我立刻想到了用 Erlang 写, 这简直是为 Erlang 量身定做的场景.
我写完了, 并且顺利的实现了功能. 这时候收到的反馈是, 写得很棒, 但是公司没有用 Erlang 的工程师, 没办法维护, 所以在建议下我又用 Node.js 的 websocket 和 Redis 的订阅机制实现了个伪实时的监控系统... 这是我第一次, 也是最后一次用 Erlang 给企业写应用.
是的, Erlang 输在了这里. Erlang 的发明者 Joe Armstrong 有一篇文章 solving-the-wrong-problem 开头第一句就说了这么一句话:
We're right and the rest of the world is wrong. We (that is Erlang folks) are solving the right problem, the rest of the world (non Erlang people) are solving the wrong problem.
现在来看, 这句话简直太中二了, 大意就是, 错的不是我, 是世界.
Erlang 为什么没有在 CPU 主频无法继续提升, 而核心数猛增的这么好的生态下火起来. 这个问题其实大佬早就说过了. Erlang 也不是唯一一个倒下去的例子. Richard P. Gabriel ( Common Lisp的发明者之一 ) 在这篇文章中 The Rise of Worse is Better 很好地阐述了为什么 Lisp 会没人用, 这个道理同样适用于 Erlang 身上.
简单来讲就是, Erlang 太好了, 为了完美的解决问题导致设计的很难学很难使用. 曲高和寡. 而那些简单好用的垃圾, 才能流行起来.
很合理, 这个道理再简单不过了. 这也是为什么大家不去看书, 而是喜欢去听喜马拉雅听, 喜欢去看知乎, 喜欢去看掘金, 喜欢这些被咀嚼一遍的东西, 觉得学到了知识. 因为对大家来说, 看书太难了, 太痛苦了.
但当时我年轻啊, 觉得那好办, 我这次选个最简单的, 于是我又跟风学了 Lua (openresty). 这个倒是很简单, 我是看左耳朵耗子老师那篇 LUA简明教程 入门的. 我的确是在厕所蹲坑的时间就学会了, 不到 1 小时 ( 有 JavaScript 经验的同学会更快一些 ). 然后写了很多个支持单机 10 万+级别并发的应用 ( 比如熊猫TV直播间的右侧礼物排行榜, 比如掘金的全局数据缓存等等 ).
但 Golang 也有了类似解决方案. fasthttp 作为 Go 的代表型高性能WEB框架, 轻松也可以支持 10 万级别的并发.
是时间不等人. Golang 在 10 年时间, 成为了怪物. 不但 STW GC 的问题解决了 ( 当然还是比不上软实时的 GC 那么平滑 ), 而且有了 kubernetes 这样的可怕的杀手锏. 也许有同学不理解 kubernetes 的可怕. 未来, 大家写的程序很可能既不是直接运行在物理机上, 也不是运行在 Xen, VMWare 等虚拟机上, 而是都会运行在 Docker 上, 由 kubernetes 进行调度. 甚至连选择的权利都没有 ( 不相信的同学可以问问在大厂的同学, 他们有自己部署目标机的 root 权限么 ).
看到这里, 是不是很熟悉? Erlang 早都实现了这一切, 甚至调度粒度更细, Erlang 实现了内置进程 ( 类似 goroutine ) 级别的调度. 而 Golang 的 goroutine 可不能跨 Docker 调度吧? ( 虽说接个网络通信模拟下也能实现类似的东西 ) . Erlang 提出了 Let it Crash 的概念. 现在看看 kubernetes 疯狂重启你的 docker pod, 是不是似曾相识?
openresty 也说明明是我先的 ( 白学现场 ), openresty 诞生之初, 能轻松支持 10 万级别并发访问的WEB框架屈指可数. 但现在 Golang 也可以了. 甚至更好 ( 少背了个 nginx 这么大个包袱 ).
读到这里, 你也许会问, 你这么作死, 每次几乎都选错了, 怎么还能混口饭吃? 那我只能说, 我编程的入门语言是 PHP, 这玩意比 Golang 还 New Jersey Style. 让我能找到工作的也是 PHP. 而我却在别的语言上持续作死. ......哈哈哈哈...... 这还真是悲哀.
有正在用 PHP 同学也许会问, 那么学 swoole 合适吗? 我的建议是. 都是成年人了, 不要做选择, 全都要. 无论是 swoole, fasthttp, netty, 都值得你看. 我学了 Erlang 也并没觉得自己吃亏. 这不, 还能在这里水一篇文章呢.
相关推荐
- redis 7.4.3更新!安全修复+性能优化全解析
-
一、Redis是什么?为什么选择它?Redis(RemoteDictionaryServer)是一款开源的高性能内存键值数据库,支持持久化、多数据结构(如字符串、哈希、列表等),广泛应用于缓存、消...
- C# 读写Redis数据库的简单例子
-
CSRedis是一个基于C#的Redis客户端库,它提供了与Redis服务器进行交互的功能。它是一个轻量级、高性能的库,易于使用和集成到C#应用程序中。您可以使用NuGet包管理器或使用以下命令行命令...
- 十年之重修Redis原理
-
弱小和无知并不是生存的障碍,傲慢才是。--------面试者总结Redis可能都用过,但是从来没有理解过,就像一个熟悉的陌生人,本文主要讲述了Redis基本类型的使用、数据结构、持久化、单线程模型...
- 高频L2行情数据Redis存储架构设计(含C++实现代码)
-
一、Redis核心设计原则内存高效:优化数据结构,减少内存占用低延迟访问:单次操作≤0.1ms响应时间数据完整性:完整存储所有L2字段实时订阅:支持多客户端实时数据推送持久化策略:RDB+AOF保障数...
- Magic-Boot开源引擎:零代码玩转企业级开发,效率暴涨!
-
一、项目介绍基于magic-api搭建的快速开发平台,前端采用Vue3+naive-ui最新版本搭建,依赖较少,运行速度快。对常用组件进行封装。利用Vue3的@vue/compiler-sfc单文...
- 项目不行简历拉胯?3招教你从面试陪跑逆袭大厂offer!
-
项目不行简历拉胯?3招教你从面试陪跑逆袭大厂offer!老铁们!是不是每次面试完都感觉自己像被大厂面试官婉拒的渣男?明明刷了三个月题库,背熟八股文,结果一被问项目就支支吾吾,简历写得像大学生课程设计?...
- 谷歌云平台:开发者部署超120个开源包
-
从国外相关报道了解,Google与Bitnami合作为Google云平台增加了一个新的功能,为了方便开发人员快捷部署程序,提供了120余款开源应用程序云平台的支持。这些应用程序其中包括了WordPre...
- 知名互联网公司和程序员都看好的数据库是什么?
-
2017年数据库领域的最大趋势是什么?什么是最热的数据处理技术?学什么数据库最有前途?程序员们普遍不喜欢的数据库是什么?本文都会一一揭秘。大数据时代,数据库的选择备受关注,此前本号就曾揭秘国内知名互联...
- 腾讯云发布云存储MongoDB服务
-
近日,著名安全专家兼Shodan搜索引擎的创建者JohnMatherly发现,目前至少有35000个受影响的MongoDB数据库暴露在互联网上,它们所包含的数据暴露在网络攻击风险之中。据估计,将近6...
- 已跪,Java全能笔记爆火,分布式/开源框架/微服务/性能调优全有
-
前言程序员,立之根本还是技术,一个程序员的好坏,虽然不能完全用技术强弱来判断,但是技术水平一定是基础,技术差的程序员只能CRUD,技术不深的程序员也成不了架构师。程序员对于技术的掌握,除了从了解-熟悉...
- 面试官:举个你解决冲突的例子?别怂!用这个套路……
-
面试官:举个你解决冲突的例子?别怂!用这个套路……最近收到粉丝私信,说被问到:团队技术方案有分歧怎么办?当场大脑宕机……兄弟!这不是送命题,是展示你情商+技术判断力的王炸题!今天教你们3招,用真实案例...
- 面试碰到MongoDB?莫慌,跟面试官这样吹MongoDB 复制集
-
推荐阅读:吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点阿里一线架构师分享的技术图谱,进阶加薪全靠它十面字节跳动,依旧空手而归,我该放弃吗?文末会分享一些MongoDB的学...
- SpringBoot集成扩展-访问NoSQL数据库之Redis和MongoDB!
-
与关系型数据库一样,SpringBoot也提供了对NoSQL数据库的集成扩展,如对Redis和MongoDB等数据库的操作。通过默认配置即可使用RedisTemplate和MongoTemplate...
- Java程序员找工作总卡项目关?
-
Java程序员找工作总卡项目关?3招教你用真实经历写出HR抢着要的简历!各位Java老哥,最近刷招聘软件是不是手都划酸了?简历投出去石沉大海,面试邀请却总在飞别人的简历?上周有个兄弟,13年经验投了5...
- Java多租户SaaS系统实现方案
-
嗯,用户问的是Java通过租户id实现的SaaS方案。首先,我需要理解用户的需求。SaaS,也就是软件即服务,通常是指多租户的架构,每个租户的数据需要隔离。用户可能想知道如何在Java中利用租户ID来...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)