单人互联网公司的无聊技术堆栈


在ListenNotes.com上搜索结果

Listen Notes是一个搜索引擎和播客数据库。 该技术实际上非常无聊。 没有AI,深度学习或区块链。 “如果必须宣布实现AI,那么您就没有使用Real AI” :)

阅读本文后,您可以重复我的项目或轻松地执行类似的操作。 您无需雇用很多开发人员。 记住, 当Instagram筹集了5750万美元并以10亿美元的价格去了Facebook时 ,他们只有13名员工 ,而不仅仅是开发人员。 Instagram购买发生在2012年初。 现在是2019年,而如今,与一个甚至只有一个人的很小的工程团队一起,比以往任何时候都更容易创建有意义的东西。

如果您还没有看过“听力笔记”,请立即尝试:



复习


让我们从项目的需求或功能开始。

听笔记提供两个功能:


一切都可以在AWS上运行,只有20台服务器在生产中(截至2019年5月5日):


运行监听笔记的服务器

通过主机名,您可以轻松猜测每个服务器的功能。

  • production-web为ListenNotes.com提供网络流量。
  • production-api提供流量API。 我们支持两种版本的API(截至2019年5月4日):v1api(已弃用)和v2api(新)
  • production-db启动PostgreSQL(主从)
  • production-es启动Elasticsearch集群。
  • 生产工人运行独立的处理任务,以始终使播客数据库保持最新状态并提供一些不可思议的功能(例如,对搜索结果进行排名,剧集/播客的推荐等)。
  • production-lb是一个负载平衡器。 为了方便起见,我还在此服务器上运行Redis和RabbitMQ。 我知道这并不完美。 但是我不是完美的人。 :)
  • production-pangu是生产服务器,有时我在其上运行一次性脚本并测试更改。 什么是盘古

大多数服务器可以水平缩放。 这就是为什么我称它们为Production-something1Production-something2等。。。很容易将Production-something3Production-something4添加到集群中

后端


整个后端是用Django / Python3编写的。 操作系统是Ubuntu。

UWSGI用于提供网络流量。 我在uWSGI进程之前安装了nginx ,它也可以用作负载平衡器。

主要数据仓库是PostgreSQL ,我在PostgreSQL上拥有多年的开发和操作经验。 借助成熟的技术,您可以在晚上安然入睡。 Redis用于各种目的(例如缓存,统计信息...)。 很容易猜到Elasticsearch是某处使用的。 是的,像大多数 无聊的 公司一样,我用它来索引播客并提供搜索查询。

Celery用于脱机处理,而Celery Beat用于计划与Cron作业相似但更好的任务。 如果将来Listen Notes变得流行,并且Celery和Beat导致缩放问题,我可能会切换到为上一个雇主执行的两个项目: ndkalendscheduler

Supervisord管理每台服务器上的进程。

等等,Docker,Kubernetes和无服务器架构又如何呢? 没什么。 凭经验,您会学会不要做太多。 实际上,我在2014年曾与Docker一起工作过一点:对于一个只有一个人的小公司来说,对于一家市值10亿美元的初创公司来说,什么是好事。

前端


Web界面主要使用React + Redux + Webpack + ES 构建 。 这些天很标准。 在生产环境中部署时,JS软件包将下载到Amazon S3并通过CloudFront发行。

在ListenNotes.com上,大多数网页的一半呈现在服务器端( Django模板 ),一半呈现在客户端( React )。 网页模板来自服务器,并且在客户端,主要呈现交互式Web应用程序。 但是由于我的懒惰和一些潜在的SEO好处,服务器上已经准备好几个网页。

音频播放器


我正在使用react-media-player的高度修改版本。 它作为Twitter上的内置播放器和第三方网站上的内置播放器在 网站上起作用:


第三方网站上的内置播放器

API


我们为开发人员提供了一个简单而强大的podcast API 。 构建API类似于构建网站。 这是用于后端的Django / Python堆栈和用于接口的ReactJS(例如API工具栏,文档...)。


监听API工具栏


收听API文档

对于API,我们需要跟踪客户在当前计费周期中使用了多少个请求,并收取费用。 不难想象Redis在这里被积极使用:)

开发者


机器准备和代码部署


Ansible用于配置。 本质上,我编写了一堆yaml文件来指示每种服务器上应配置哪些配置文件和哪种软件。 只需单击一个按钮,即可部署具有所有正确配置文件和所有已安装软件的服务器。 这是这些Ansible yaml文件的目录结构:


我最好命名目录。 但是话又说回来,现在就足够了

Ansible还有助于在生产中部署代码。 基本上,我有一个可在macOS上运行的deploy.sh包装器脚本

  ./deploy.sh生产HEAD网站 

该脚本采用三个参数:

  • 环境 :生产或分期。
  • listennotes存储库的版本 :HEAD表示“只需部署最新版本”。 如果指定了SHA提交,它将部署特定版本的代码-当我需要在不良部署后回滚时,此功能特别有用。
  • 服务器类型 :Web,Worker,API或全部。 我不需要一次部署到所有服务器。 有时我会更改Javascript代码,然后只需要在Web上部署它,而无需接触API或工作人员。

部署过程主要由Ansible yaml文件组织,当然非常简单:

  • 在我的Macbook Pro上 ,如果这是用于Web服务器的部署,则将创建Javascript包并将其上传到S3。
  • 在目标服务器上, git将listennotes存储库克隆到一个名为timestamp的文件夹中,检查特定版本,并安装新的Python依赖项(如果有)。
  • 在目标服务器上,符号链接指向前面提到的名为timestamp的文件夹,然后我们使用supervisorctl重新启动服务器。

如您所见,我没有使用这些精美的CI工具。 只有最简单,最可靠的工具才能真正起作用。

监控和警报


监视和警报由Datadog完成 。 一个简单的仪表板显示了一些高级指标。 这里的所有内容旨在提高我在生产环境中忙于服务器的信心。


截至2017年12月的Datadog Dashboard for Listen Notes

Datadog已连接到PagerDuty。 如果出现问题,PagerDuty将通过电话和短信向我发送通知。

我还使用Rollbar跟踪Django代码的状态并捕获意外的异常,并通过电子邮件和Slack通知我。

松弛非常活跃。 是的,这是一家只有一个人的公司,因此不需要进行通讯,而是在应用程序级别监视有趣的事件。 除了将Datadog和Rollbar与Slack集成之外,Slack后端Web代码还集成了Slack传入Web挂钩,以通知您用户注册或一些有趣的操作(例如,添加或删除元素)。 这是科技公司非常普遍的做法。 如果您阅读有关Amazon或PayPal成立初期的书籍,您会发现两家公司都有类似的通知机制:每当用户注册时,都会有“叮当”声通知办公室中的所有人。

自2017年初推出以来,Listen Notes并未造成严重的停机(超过5分钟),除此之外。 在开发DevOps方面,我总是非常谨慎和实用。 对于服务器,如果由于进入新闻界或其他原因而导致出席人数激增,则会提供大量开销。

发展历程


我在旧金山的WeWork工作。 有些人可能会问,为什么不在家中或在一些休闲咖啡馆工作。 好吧,我真的很重视生产力,并愿意为此投资。 我认为家庭混乱不会促进软件(或知识/创造力领域的任何工作)的开发。 我很少每天工作超过8小时(对不起996人 )。 我想每一分钟计数。 因此,我需要一个良好且相对昂贵的私人办公室。 我没有浪费时间来浪费金钱,而是优化时间来利用它来牟利。


我在WeWork的办公室

我在MacBook Pro上工作。 Vagrant + VirtualBox内部运行几乎相同的基础架构。 对于开发环境,Vagrant使用与上述相同的Ansible yaml文件集。

我支持整体存储库的理念。 因此,只有一个带有DevOps脚本,前端和后端代码的listennotes存储库。 它作为GitHub上的私有存储库托管。 所有开发都在主分支中。 我很少使用早午餐。

我编写代码并使用PyCharm运行开发服务器(Django runserver和webpack开发服务器)。 是的,我知道,这很无聊。 毕竟,这不是Visual Studio Code或Atom还是某种很酷的IDE。 但是对我来说,PyCharm可以正常工作。 老学校,你能做什么。


我的pycharm

杂项


我使用了大量有用的工具和服务来将Listen Notes创建为产品和公司:


保持冷静,不要混蛋...


如您所见,我们正处在开展业务的绝佳时机。 有许多现成的工具和服务可以节省时间和金钱,从而提高您的生产率。 现在是历史上最好的时机,使用一个简单而无聊的技术与一个很小的团队(或仅由一个人的努力)创建对人类有用的东西。

随着时间的流逝,公司变得越来越小。 不再需要雇用大量的全职员工。 要完成所有工作,您可以使用SaaS服务和承包商进行订购。

基本上,创建项目的主要障碍是过度思考。 如果那样,那该怎么办。 男孩,没人需要你。 每个人都忙于自己的事情。 除非您证明自己值得关注,否则没人会对您和您的项目感兴趣。 即使您锁定发射器,也不会有人注意到。 大处着眼,从小处开始,快速行动。 如果您真的解决了问题,那么使用无聊的技术并从简单的事情(甚至是丑陋的事情)开始是绝对正常的。


现在有这么多人从事货运崇拜 。 忽略噪音。 保持冷静,不要混蛋。

Source: https://habr.com/ru/post/zh-CN467793/


All Articles