选自listennotes.com
作者:Wenbin Fang
机器之心编译
参加:高璇、张倩
创立一个互联网公司需求几个人?一位来自旧金山的软件工程师告知咱们:一个就够了。这位工程师创立了一个名为「Listen Notes」的播客查找引擎,像谷歌相同能够便利地查找海量播客资源。在这篇文章中,这位工程师向咱们介绍了他创立「Listen Notes」用到的各种「无聊」技能。
Listen Notes 地址:https:///
Listen Notes 是一个播客查找引擎和数据库。而 Listen Notes 背面的技能实践上毫无新意。没有 AI,没有深度学习,没有区块链。「任何说我有必要运用 AI 的人都没有运用真实的 AI」,文章作者这样表明。
作者在前言中说:「阅览完本文后,读者应该能够仿制我为 Listen Notes 构建的内容,或许轻松地完结相似的操作。你无需延聘许多工程师。请记住,当 Instagram 融了 5750 万美元并被 Facebook 以 10 亿美元收买时,他们只需 13 名职工——而且并非一切人都是工程师。Instagram 的故事发生在 2012 年头。现在是 2019 年了,一个小型工程团队乃至一个人发明一些有意义的东西比以往任何时分都有或许。」
这篇介绍了用许多「无聊」技能创立互联网产品的文章引起了许多网友的评论,有人表明,技能自身便是一种手法,假如能够很好地完结产品的功用,即便是「无聊」的技能也会很棒。
也有网友表明,能够一个人一起把握前端、数据库、查找引擎、存储、集群、开发、源操控和权限办理等许多技能是十分可贵的。
鄙人文中,作者从前端、后端、API 等几个视点介绍了自己用到的技能细节。
概述
让咱们从 Listen Notes 项目的需求和功用说起。
Listen Notes 为终端用户做了两件事:
为播客听众供给了网站 ListenNotes.com。该网站能够供给查找引擎、播客数据库、「稍后听」播放列表、音频编排以及「收听提示」(当新播客中提及指定的关键字时,它会告诉你)。
开发人员的播客查找和目录 API。咱们需求盯梢 API 运用情况,从付费用户处获取资金,进行客户支撑等等。
一切都在 AWS 上运转。到 2019 年 5 月 5 日有 20 台服务器在作业:
运转 Listen Notes 的服务器。
读者能够经过主机名轻松猜出每个服务器的使命。
production-web 为 ListenNotes.com 供给网络流量。
production-api 供给 api 流量。咱们运转两个版别的 API(到 2019 年 5 月 4 日),即 v1api(旧版别)和 v2api(新版别)。
production-db 运转 PostgreSQL(主服务器和副服务器)
production-es 运转 Elasticsearch 集群。
production-worker 运转离线处理使命,以使播客数据库始终保持最新状况,并供给一些奇特功用(例如查找成果排名、剧集/播客引荐......)。
production-lb 是负载均衡器。为便利起见,我还在这台服务器上运转 Redis 和 RabbitMQ。我知道这不是最理想的计划。横竖我不是完美的人:)
production-pangu 是相似出产的服务器,我有时会运转一次性脚本和测验更改。那「pangu」是什么意思?请自行查找。
这些服务器大多数都能够水平扩展。这便是为什么我将它们命名为 production-something1,production-something2 ...... 将 production-something3 和 production-something4 再参加其中就十分简略了。
后端
整个后端是用 Django/Python3 编写的。操作系统是 Ubuntu。
运用 uWSGI 来供给网络流量。NGINX 放在 uWSGI 进程前面充任负载均衡器。
首要数据存储是 PostgreSQL,我有多年开发和运营经历——经过测验的技能很完善,所以我晚上能睡得着觉。Redis 用于缓存、统计数据等多个当地。Elasticsearch 用来索引播客和剧集并供给查找查询,就像大多数无聊的企业相同。
Celery 用于离线处理。而 Celery Beat 用于调度使命,相似于 Cron 作业,但功用更佳。假如将来 Listen Notes 越来越受欢迎而且 Celery&Beat 导致一些扩展问题,我或许会转向我为前雇主做的两个项目:ndkale 和 ndscheduler。
Supervisord 用于每台服务器上的进程办理。
那 Docker / Kubernetes / serverless 怎么样?不。跟着经历堆集,你就会知道什么时分不要过度规划。实践上,我在 2014 年为我的前雇主做过一些前期的 Docker 作业,这关于一家市值十亿美元的中等规划创业公司来说是件功德,但关于一个小型创业公司来说或许有点「大炮打蚊子」了。
前端
网页前端首要运用 React+Redux+Webpack+ES。这是十分规范的。在布置到出产时,JS 包将上传到 Amazon S3 并经过 CloudFront 供给服务。
在 ListenNotes.com 上,大多数网页都是半服务器端呈现(Django 模板)和半客户端呈现(React)。服务器端呈现部分供给网页的样板,客户端呈现部分基本上是交互式网页运用程序。可是一些网页彻底经过服务器端呈现,由于我的懒散使作业变得完美以及呈现一些潜在的 SEO 优势。
音频播放器
我运用了一个经过很多修正的 react-media-player 在 ListenNotes.com 上构建音频播放器,该播放器运用在 Listen Notes 网站、Twitter 嵌入式播放器和第三方网站上的嵌入式播放器中:
第三方网站上的嵌入式播放器。
播客 API
咱们为开发人员供给简略牢靠的播客 API。构建 API 相似于构建网站。在后端运用相同的 Django/Python 仓库,前端运用相同的 ReactJs(例如 API Dashboard、文档......)。
ListenNotes 的 API dashboard。
ListenNotes 的 API 文档。
关于 API,咱们需求追寻用户在当时计费周期中运用的恳求数量,并在周期结束时收取费用。不难想象,Redis 在这儿被很多运用:)
DevOps
机器装备和代码布置
我运用 Ansible 进行机器装备。基本上,我写了一堆 yaml 文件来指定需求什么类型的服务器、什么装备文件和什么软件。我能够用一切正确的装备文件和软件发动一个服务器,并经过「一键装置」完结装置。这是 Ansible yaml 文件的目录结构:
我能够在命名方面做得更好。但现在现已满足好了。
我还运用 Ansible 将代码布置到出产环境中。基本上,我有一个在 macOS 上运转的打包脚本 deploy.sh:
deploy.sh 脚本有三个参数:
环境:出产或分段;
listennotes repo 版别:HEAD 表明「仅布置最新版别」。假如指定了 git commit 的 SHA,那么它将布置特定版别的代码——当我需求从过错的布置撤回时,这特别有用;
服务器类型:web、worker、api 或一切服务器。我不用一次布置到一切服务器。有时我会对 Javascript 代码进行修正,然后我只需求布置到 Web,而无需触及 api 或 worker。
布置进程首要由 Ansible yaml 文件拟定,当然,它很简略:
在 Macbook Pro 上,假如要布置到 Web 服务器,则构建 Javascript 包并上传到 S3;
在方针服务器上,git 将 listennotes repo 克隆到一个以时刻戳命名的文件夹,查看特定版别,然后装置新的 Python 依靠项(假如有的话);
在方针服务器上,将符号链接切换到上述时刻戳命名文件夹,并经过 supervisorctl 重新发动服务器。
我不运用那些花哨的 CI 东西。实践的操作十分简易。
监控和警报
我运用 Datadog 进行监控和警报。我在一个简略的监控界面中有一些高档目标。这儿所做的一切都是为了在弄乱出产服务器时增强决心。
适用于 Listen Notes 的 Datadog 监控界面(到 2017 年 12 月)。
我将 Datadog 连接到 PagerDuty。假如呈现问题,PagerDuty 将经过电话和短信向我发送提示。
我还运用 Rollbar 来监控 Django 代码的运转状况,它会捕捉反常,并经过电子邮件和 Slack 告诉我。
我常常运用 Slack。这是个一个人的公司,所以我不运用 Slack 与人沟通。我运用 Slack 来监督风趣的运用级事情。除了将 Datadog 和 Rollbar 与 Slack 集成之外,我还在 Listen Notes 后端代码中运用 Slack 传入 webhooks,以便在用户注册或履行一些操作(例如增加或删去内容)时告诉我。这是科技公司常用的做法。当你阅览亚马逊或 PayPal 前期开展的一些书本时,你会发现两家公司都有相似的告诉机制:每逢用户注册时,都会有「叮」的声响告诉办公室中的每个人。
自 2017 年头推出以来,Listen Notes 只呈现过一次长时溃散(大于 5 分钟)。在这些操作方面,我总是十分慎重和务实。网络服务器明显过剩,是为了避免某个新闻事情或其他要素导致流量飙升。
开发
我在旧金山的 WeWork 同享空间作业。有些人或许想知道为什么不在家里或咖啡店作业。那是由于我十分重视功率,我愿意在功率上出资。我不相信堆砌时刻就能开发出好软件。我很少一天作业超越 8 小时(对不住了,996 的朋友)。我想把每一分钟都花得有意义。因而,我需求一个精美且相对贵重的私家办公室:) 与其为了省钱花更多时刻,我挑选花费更少的时刻去挣钱:)
我在 WeWork 的办公室。
我用的电脑是 MacBook Pro。我在 Vagrant+ VirtualBox 中运转(简直)相同的根底架构。我运用与上述相同的 Ansible yaml 文件集在 Vagrant 中装备开发环境。
我附和 monorepo 理念。因而,我只需一个 listennotes repo,包括 DevOps 脚本、前端和后端代码。这个 listennotes repo 是作为 GitHub 私家 repo 保管。我在主分支上做一切的开发作业。我很少运用功用分支。
我运用 PyCharm 编写代码并运转 dev 服务器(Django runserver 和 webpack dev server)。我知道这很无聊。究竟它不是 Visual Studio Code、Atom 或 IDE。但 PyCharm 对我来说作用很好。究竟我很老派。
我的 PyCharm。
其他
我运用许多有用的东西和服务将 Listen Notes 打造为一款产品和一个公司:
iTerm2 和 tmux 用于获取终端内容。
Notion 用于 TODO 列表、维基、记笔记和规划文档......
G Suite 用于 @listennotes.com 电子邮件帐户、日历和其他 Google 服务。
MailChimp 发送每月电子邮件简报。
Amazon SES 用于发送买卖邮件和营销邮件。
Gusto 用于付出自己和非 Upwork 承包人的薪酬。
Upwork 用于寻觅承包人。
Google Ads Manager 办理直销广告并盯梢绩效。
Carbon Ads 和 BuySellAds 用于备用广告。
Cloudflare 用于 DNS 办理、CDN 和防火墙。
Zapier 和 Trello 简化了播客作业流程。
Medium 是公司博客的前言。
Godaddy 和 Namecheap 用于域名。
Stripe 用于从用户处获取资金(首要用于 API)。
Google speech-to-text API 用于语音转化。
Kaiser Permanente 用于健康稳妥。
Stripe Atlas 用于兼并 Listen Notes Inc。
Clerky 为融资(SAFE)和雇佣非 Upwork 承包人生成法令文件。
Quickbooks 用于记账。
1password 用于办理很多服务的登录凭据。
Brex 用于信用卡,还能够取得额定$ 5,000 AWS 积分,能够在 WeWork 或 Stripe Atlas 的 AWS 积分上运用。
Bonvoy Business Amex 卡——能够取得豪华酒店和航班的 Marriott Bonvoy 积分。这是游览的最佳信用卡积分:)
Capital One Spark 用于支票账户。
胆大心细,立刻举动
如你所见,咱们日子在一个创业的黄金时代。有许多现成的东西和服务能够节约咱们的时刻和金钱,进步咱们的出产力。运用简略而单调的技能,以一己之力(或一个团队)发明对国际有用的东西比以往任何时分都更有或许。
跟着时刻的推移,公司会变得越来越小。你无需雇佣很多的全职职工。你能够经过购买服务或外包来完结作业。
大多数时分,发明和传达的最大妨碍是想太多。这怎么办?那怎么办?孩子,你把自己看太重了。每个人都忙于自己的日子。没有人关怀你和你创立的东西,直到你证明你值得他人重视。即便你搞砸了开始的产品,也很少有人会注意到。「微观思想,细节到位,敏捷反响!」只需你真实处理了问题,就算运用无聊的技能完结简略(乃至粗陋)的使命也彻底没问题。
本文为机器之心编译,转载请联络本大众号取得授权。
------------------------------------------------