在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-something1 ,
Production-something2等。。。很容易将
Production-something3和
Production-something4添加到集群中 。
后端
整个后端是用Django / Python3编写的。 操作系统是Ubuntu。
UWSGI用于提供网络流量。 我在uWSGI进程之前安装了
nginx ,它也可以用作负载平衡器。
主要数据仓库是
PostgreSQL ,我在
PostgreSQL上拥有多年的开发和操作经验。 借助成熟的技术,您可以在晚上安然入睡。
Redis用于各种目的(例如缓存,统计信息...)。 很容易猜到
Elasticsearch是在
某处使用的。 是的,像
大多数 无聊的 公司一样,我用它来索引播客并提供搜索查询。
Celery用于脱机处理,而
Celery Beat用于计划与Cron作业相似但更好的任务。 如果将来Listen Notes变得流行,并且Celery和Beat导致缩放问题,我可能会切换到为上一个雇主执行的两个项目:
ndkale和
ndscheduler 。
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 NotesDatadog已连接到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服务和承包商进行订购。
基本上,创建项目的主要障碍是过度思考。 如果那样,那该怎么办。 男孩,没人需要你。 每个人都忙于自己的事情。 除非您证明自己值得关注,否则没人会对您和您的项目感兴趣。 即使您锁定发射器,也不会有人注意到。 大处着眼,从小处开始,快速行动。 如果您真的解决了问题,那么使用无聊的技术并从简单的事情(甚至是丑陋的事情)开始是绝对正常的。
现在有这么多人
从事货运崇拜 。 忽略噪音。 保持冷静,不要混蛋。