Довольно интересно увидеть этот вопрос на каком-то форуме.Какой язык лучше рвать-это чуть ли не лучшая ведущая тема среди инженеров.Сегодня я просто хочу рассказать о том,что я думаю о Go,и некоторые мои прогулки в обход.
Я узнал о языке Go в школе в 2010 г. В то время с языком Go все еще царил беспорядок, а STW GC была лучшей мишенью для всех, кто издевался над языком Go.До тех пор, пока предложение было черным, фанаты Go просто задохнулись. и безмолвный.
Я думал о том, чтобы запастись языком с параллельной моделью программирования.Я чувствовал, что языки с параллельной моделью программирования определенно будут мейнстримом в будущем, когда частота процессора больше не будет увеличиваться.Это сильный конкурент разделяемой памяти языки.
Шорт-лист выглядит следующим образом:
Erlang, Golang, Scala с Akka.
Во-первых, я исключил Scala, потому что я не думаю, что реализация Akka хороша, а у Scala в то время не было существенного тяжеловесного приложения (Spark был с открытым исходным кодом в 2010 году, но станет популярным после 2012 года). Далее идут Go и Erlang.
Я был очень одержим Erlang в то время, потому что Erlang был единственным языком программирования, который реализовал мягкий планировщик в реальном времени, а это означало, что эту штуку можно было использовать непосредственно для написания телефонных коммутаторов (конечно, Erlang был создан для этой цели), и если вы используете Go для записи телефонного коммутатора, он, скорее всего, будет на телефоне, нажмете STW GC, и тогда вы не услышите, что говорят на другой стороне телефона (вот почему WhatsApp использует Erlang позже 50 инженеров написали системы, поддерживающие 900 миллионов пользователей).
Более того, реализованная Erlang система добивается доступности девять девяток.Что это за концепция?Это означает, что время простоя за весь год не превышает 31,56 миллисекунды.Практически нет простоев.Alibaba Cloud может сказать только о своей надежности6 9, доступности AWS составляет всего 99,95%, что означает около 4,5 часов простоя в год.
Еще одним хорошим дизайном Erlang является то, что его собственная среда выполнения представляет собой не столько виртуальную машину, сколько операционную систему, а контейнер времени выполнения.Вы должны знать, что BEAM (название виртуальной машины Erlang) был реализован в 1992 году. примерно с 2013 года. Какая продвинутая концепция.
Так что Erlang я выучил без раздумий, а Golang я просто посмотрел на синтаксис, написал несколько демок и посмотрел.
Наступил 2012 год, я поехал на стажировку в поиск 360. Одной из поставленных передо мной задач было написать программу для мониторинга, для сбора и отображения состояния соединений nginx в режиме реального времени, а также визуализировать данные для эксплуатации и обслуживания. инженеры планируют машины для справки.Количество машин очень велико Трудно отображать все больше и больше в режиме реального времени.Я сразу подумал о написании на Erlang, который представляет собой сцену, адаптированную для Erlang.
Я закончил писать и успешно внедрил функцию.В отзывах, которые я получил в это время, было то, что написание было отличным, но компания не использовала инженеров Erlang, поэтому не было возможности поддерживать его, поэтому я использовал веб-сокет Node.js и Redis по предложению Механизм подписки реализует систему мониторинга псевдо-реального времени... Это первый и последний раз, когда я использую Erlang для написания приложений для предприятий.
Да, Эрланг здесь проигрывает Джо Армстронгу, изобретателю Эрланга, есть статья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 не загорелся в такой хорошей экосистеме, что частота процессора не могла продолжать увеличиваться, а количество ядер резко возрастало.На самом деле большой парень уже задавал этот вопрос.Erlang не единственный пример провала. Ричард П. Габриэль (один из изобретателей Common Lisp) в этой статьеThe Rise of Worse is BetterЭто хорошее объяснение того, почему Lisp не используется, и тот же принцип применим к Erlang.
Короче говоря, Erlang настолько хорош, что его трудно изучить и использовать для идеального решения задач.
Это разумно, и причина не может быть проще.Вот почему люди не читают книги, а любят слушать Гималаи, любят читать Чжиху, любят смотреть Наггетс, любят эти разжеванные раз за разом вещи, и чувствуют, что усвоили знания.Потому что для всех чтение слишком сложно и болезненно.
Но я был молод в то время и думал, что с этим легко справиться. В этот раз я выбрал самый простой, поэтому я последовал за Lua (openresty). Это очень просто. Я прочитал статью учителя левоухой мыши.Краткое руководство по LUAПриступаем к работе. Я научился этому, пока сидел на корточках в туалете, это заняло менее 1 часа (студенты с опытом работы с JavaScript будут быстрее). Потом я написал много приложений, поддерживающих параллелизм уровня 100 000+ на одной машине (таких как Panda TV Список подарков справа от комнаты прямого эфира, например глобальный кеш данных Наггетс и т.д.).
Но у Golang также есть похожее решение: Fasthttp, представляющий высокопроизводительную веб-инфраструктуру Go, может легко поддерживать параллелизм на уровне 100 000.
Время никого не ждет.Golang за 10 лет стал монстром.Мало того,что проблема STW GC решена (конечно не такая гладкая как soft real-time GC),так еще и есть страшный убийца такой как kubernetes , Может быть, некоторые студенты не понимают ужаса kubernetes.В будущем программы, которые вы пишете, вероятно, не будут работать ни непосредственно на физических машинах, ни на виртуальных машинах, таких как Xen, VMWare и т. д., но все они будут работать на Docker , запланированный kubernetes.Даже выбирай (Кто не верит, может спросить у своих одноклассников на большой фабрике, есть ли у них root-права, чтобы развернуть целевую машину самостоятельно).
Видя это, вы знакомы? Erlang уже реализовал все это, и даже гранулярность планирования лучше. Erlang реализует планирование на уровне встроенного процесса (аналогично горутине). А горутину Golang нельзя запланировать через Docker? (Хотя Это связано Аналогичные вещи могут быть достигнуты при моделировании сетевого взаимодействия. Erlang предложил концепцию Let it Crash. Теперь посмотрите на kubernetes, лихорадочно перезапускающего ваш docker pod, вам это знакомо?
Openresty также показывает, что я был первым (сайт Бай Сюэ), когда родился openresty, было всего несколько веб-фреймворков, которые могли легко поддерживать 100 000 одновременных доступов. груз).
Прочитав это, вы можете спросить, как можно еще дурить себя, если почти каждый раз делаешь неправильный выбор?Тогда я могу только сказать, что мой язык программирования — PHP, который новее, чем Golang. PHP, который дал мне работу. И я умираю от других языков. …хахахаха…это действительно грустно.
Некоторые студенты, использующие PHP, могут спросить, уместно ли изучать swoole? Мое предложение таково. Они взрослые люди, не делайте выбора, они все нуждаются в них. Будь то swoole, fasthttp, netty, все они заслуживают внимания. Я выучил Erlang, я не чувствую себя в невыгодном положении, нет, я все еще могу написать здесь статью.