Tumpukan teknologi yang membosankan dari perusahaan internet satu orang


Hasil Pencarian di ListenNotes.com

Listen Notes adalah mesin pencari dan basis data podcast. Teknologi ini sebenarnya sangat membosankan. Tidak ada AI, pembelajaran mendalam atau blockchain. โ€œJika Anda harus mengumumkan implementasi AI, maka Anda tidak menggunakan AI Nyataโ€ :)

Setelah membaca artikel ini, Anda dapat mengulang proyek saya atau dengan mudah melakukan hal serupa. Anda tidak perlu menyewa banyak pengembang. Ingat, ketika Instagram mengumpulkan $ 57,5 โ€‹โ€‹juta dan pergi ke Facebook dengan $ 1 miliar , mereka hanya memiliki 13 karyawan - dan ini bukan hanya pengembang. Pembelian Instagram terjadi pada awal 2012. Sekarang adalah tahun 2019, dan hari ini lebih dari sebelumnya mudah untuk membuat sesuatu yang bermakna dengan tim teknik kecil - bahkan dari satu orang.

Jika Anda belum melihat Listen Notes, coba sekarang:



Ulasan


Mari kita mulai dengan persyaratan atau fitur proyek.

Listen Notes menyediakan dua fungsi:

  • Situs web untuk pendengar podcast. Berikut adalah mesin pencari, database podcast, daftar putar untuk mendengarkan nanti , klip yang disimpan dipotong dari podcast , dan pemberitahuan ketika kata kunci yang ditentukan disebutkan dalam beberapa podcast baru di Internet.
  • Cari podcast dan API untuk pengembang. Kita perlu melacak penggunaan API, menerima uang dari pelanggan, memberikan dukungan pelanggan dan banyak lagi.

Semuanya berfungsi pada AWS, hanya 20 server yang diproduksi (per 5 Mei 2019):


Server yang menjalankan Listen Notes

Dengan nama host, Anda dapat dengan mudah menebak apa yang dilakukan oleh setiap server.

  • production-web melayani lalu lintas web untuk ListenNotes.com.
  • production-api melayani API lalu lintas. Kami mendukung dua versi API (per 4 Mei 2019): v1api (usang) dan v2api (baru)
  • production-db meluncurkan PostgreSQL (master dan slave)
  • production-es meluncurkan cluster Elasticsearch.
  • pekerja produksi meluncurkan tugas pemrosesan yang berdiri sendiri untuk selalu memperbarui basis data podcast dan menyediakan beberapa fitur ajaib (mis. hasil pencarian peringkat, rekomendasi untuk episode / podcast, dll.).
  • produksi-lb adalah penyeimbang beban. Untuk kenyamanan, saya juga menjalankan Redis dan RabbitMQ di server ini. Saya tahu ini tidak sempurna. Tapi aku bukan orang yang sempurna. :)
  • production-pangu adalah server produksi tempat saya terkadang menjalankan skrip satu kali dan menguji perubahan. Apa itu pangu ?

Sebagian besar server dapat diskalakan secara horizontal. Itu sebabnya saya menyebutnya produksi-sesuatu1 , produksi-sesuatu2 , dll ... Sangat mudah untuk menambahkan produksi-sesuatu3 dan produksi-sesuatu4 ke cluster .

Backend


Seluruh backend ditulis dalam Django / Python3. Sistem operasi adalah Ubuntu.

UWSGI digunakan untuk melayani lalu lintas web. Saya menginstal nginx sebelum proses uWSGI, ia juga berfungsi sebagai penyeimbang beban.

Gudang data utama adalah PostgreSQL , yang dengannya saya memiliki pengalaman luas dalam pengembangan dan pengoperasian selama bertahun-tahun. Dengan teknologi terbukti, Anda tidur nyenyak di malam hari. Redis digunakan untuk berbagai keperluan (mis. Caching, statistik ...). Mudah ditebak bahwa Elasticsearch digunakan di suatu tempat . Ya, saya menggunakannya untuk mengindeks podcast dan melayani permintaan pencarian, seperti kebanyakan perusahaan yang membosankan .

Seledri digunakan untuk pemrosesan offline, sedangkan Seledri Detak dimaksudkan untuk menjadwalkan tugas yang mirip dengan pekerjaan Cron, tetapi sedikit lebih bagus. Jika di masa mendatang Listen Notes menjadi populer, dan Celery dan Beat menyebabkan masalah dengan penskalaan, saya mungkin akan beralih ke dua proyek yang saya lakukan untuk perusahaan sebelumnya: ndkale dan ndscheduler .

Supervisord mengelola proses di setiap server.

Tunggu, bagaimana dengan Docker, Kubernetes, dan arsitektur tanpa server? Tidak ada yang seperti itu. Dengan pengalaman, Anda belajar untuk tidak melakukan terlalu banyak. Bahkan, saya bekerja sedikit dengan Docker pada tahun 2014 di pekerjaan sebelumnya: apa yang baik untuk startup rata-rata senilai satu miliar dolar tampaknya tidak diperlukan untuk sebuah perusahaan kecil yang terdiri atas satu orang.

Frontend


Antarmuka web terutama dibangun menggunakan React + Redux + Webpack + ES . Cukup standar hari ini. Ketika digunakan dalam lingkungan produksi, paket JS diunduh ke Amazon S3 dan dikeluarkan melalui CloudFront .

Pada ListenNotes.com, sebagian besar halaman web setengah ditampilkan di sisi server ( template Django ) dan setengah di sisi klien ( React ). Templat halaman web berasal dari server, dan di sisi klien, aplikasi web interaktif terutama dibuat. Tetapi beberapa halaman web sepenuhnya disiapkan di server karena kemalasan saya dan beberapa manfaat SEO potensial.

Pemutar audio


Saya menggunakan versi yang sangat dimodifikasi dari media-player . Ini berfungsi di situs web sebagai pemain built-in di Twitter dan pemain built-in di situs pihak ketiga:


Pemain bawaan di situs pihak ketiga

API


Kami menyediakan pengembang dengan API podcast sederhana dan kuat. Membangun API mirip dengan membangun situs web. Berikut adalah tumpukan Django / Python yang sama untuk backend dan ReactJS untuk antarmuka (mis. API toolbar, dokumentasi ...).


Dengarkan Toolbar API


Dengarkan Dokumentasi API

Untuk API, kita perlu melacak berapa banyak permintaan yang digunakan klien dalam siklus penagihan saat ini, dan membebankan biaya. Sangat mudah untuk membayangkan bahwa Redis aktif digunakan di sini :)

Devops


Persiapan Mesin dan Penerapan Kode


Ansible digunakan untuk penyediaan. Pada dasarnya, saya menulis banyak file yaml untuk menunjukkan file konfigurasi mana dan perangkat lunak apa yang harus ada pada setiap jenis server. Saya dapat menggunakan server dengan semua file konfigurasi yang benar dan semua perangkat lunak yang diinstal dengan mengklik tombol. Berikut adalah struktur direktori untuk file yaml yang mungkin:


Saya bisa memberi nama direktori yang lebih baik. Tapi sekali lagi, itu sudah cukup sekarang

Ansible juga membantu untuk menyebarkan kode dalam produksi. Pada dasarnya, saya memiliki skrip wrapper deploy.sh yang berfungsi di macOS:

  ./deploy.sh web HEAD produksi 

Script ini mengambil tiga argumen:

  • Lingkungan : produksi atau pementasan.
  • Versi repositori Listennotes : HEAD berarti "cukup gunakan versi terbaru." Jika komit SHA ditentukan, itu akan menyebarkan versi kode tertentu - ini sangat berguna ketika saya harus memutar kembali setelah penyebaran yang buruk.
  • Jenis server : web, pekerja, API atau semua. Saya tidak perlu menyebar ke semua server sekaligus. Terkadang saya membuat perubahan pada kode Javascript, maka saya perlu menggunakannya hanya di web, tanpa menyentuh API atau pekerja.

Proses penyebaran terutama diatur oleh file yaml yang dimungkinkan, dan, tentu saja, sangat sederhana:

  • Di Macbook Pro saya , jika ini adalah penyebaran untuk server web, maka paket Javascript dibuat dan diunggah ke S3.
  • Pada server target, git mengkloning repositori Listennotes ke folder yang disebut timestamp, memeriksa versi tertentu, dan menginstal dependensi Python baru, jika ada.
  • Di server target, tautan simbolik menunjuk ke folder yang disebut timestamp, lalu kami me-restart server menggunakan supervisorctl.

Seperti yang Anda lihat, saya tidak menggunakan alat CI mewah ini. Hanya alat paling sederhana dan paling dapat diandalkan yang benar-benar berfungsi.

Pemantauan dan Peringatan


Pemantauan dan peringatan dilakukan oleh Datadog . Dasbor sederhana menunjukkan beberapa metrik tingkat tinggi. Semuanya di sini dirancang untuk meningkatkan kepercayaan diri saya ketika sibuk dengan server dalam produksi.


Dasbor Datadog untuk Listen Notes, per Desember 2017

Datadog terhubung ke PagerDuty. Jika ada yang tidak beres, PagerDuty akan mengirimkan saya pemberitahuan melalui telepon dan SMS.

Saya juga menggunakan Rollbar untuk melacak status kode Django dan menangkap pengecualian yang tidak terduga, memberi tahu saya melalui email dan Slack.

Slack sangat aktif. Ya, ini adalah perusahaan dengan satu orang, jadi tidak diperlukan untuk komunikasi, tetapi untuk memantau acara menarik di tingkat aplikasi. Selain mengintegrasikan Datadog dan Rollbar dengan Slack, kode web backend Slack juga mengintegrasikan kait web Slack yang masuk untuk memberi tahu Anda tentang pendaftaran pengguna atau beberapa tindakan menarik (misalnya, menambah atau menghapus elemen). Ini adalah praktik yang sangat umum di perusahaan teknologi. Jika Anda membaca buku tentang tahun-tahun awal Amazon atau PayPal, Anda akan mengetahui bahwa kedua perusahaan memiliki mekanisme pemberitahuan yang serupa: setiap kali pengguna mendaftar, ada suara "ding" untuk memberi tahu semua orang di kantor.

Sejak diluncurkan pada awal 2017, Listen Notes belum mengalami downtime yang serius (lebih dari 5 menit), kecuali untuk ini . Saya selalu sangat berhati-hati dan praktis dalam mengerjakan DevOps. Untuk server, overhead serius disediakan jika terjadi lonjakan besar kehadiran karena masuk ke pers atau sesuatu yang lain.

Pengembangan


Saya bekerja untuk WeWork di San Francisco. Beberapa orang mungkin bertanya, mengapa tidak hanya bekerja dari rumah atau dari beberapa kafe biasa. Yah, saya sangat menghargai produktivitas dan bersedia menginvestasikan uang di dalamnya. Saya tidak percaya bahwa kekacauan rumah berkontribusi pada pengembangan perangkat lunak (atau pekerjaan apa pun di bidang pengetahuan / kreativitas). Saya jarang bekerja lebih dari 8 jam sehari (maaf 996 orang ). Saya ingin menghitung setiap menit. Jadi, kantor pribadi yang bagus dan relatif mahal adalah yang saya butuhkan. Alih-alih menabung untuk mengurangi waktu, saya mengoptimalkan waktu untuk menggunakannya secara menguntungkan dan menghasilkan uang.


Kantor saya di WeWork

Saya bekerja di MacBook Pro. Infrastruktur yang hampir identik berjalan di dalam Vagrant + VirtualBox . Untuk lingkungan pengembangan, Vagrant menggunakan set file yaml Ansible yang sama seperti dijelaskan di atas.

Saya mendukung filosofi repositori monolitik . Dengan demikian, ada satu dan hanya satu tempat penyimpanan catatan dengan skrip DevOps, kode frontend dan backend. Di-host sebagai repositori pribadi di GitHub. Semua pengembangan ada di cabang utama. Saya jarang menggunakan brunch.

Saya menulis kode dan menjalankan server dev (server run Django dan server dev webpack) menggunakan PyCharm . Ya, saya tahu, itu membosankan. Lagi pula, ini bukan Visual Studio Code atau Atom atau semacam IDE keren. Tetapi bagi saya, PyCharm bekerja dengan baik. Sekolah tua, apa yang bisa Anda lakukan.


Parmarmu

Lain-lain


Ada banyak alat dan layanan berguna yang saya gunakan untuk membuat Listen Notes sebagai produk dan perusahaan:


Tetap tenang dan jangan menyentak ...


Seperti yang Anda lihat, kami hidup dalam waktu yang tepat untuk meluncurkan bisnis kami. Ada begitu banyak alat dan layanan di luar rak yang menghemat waktu dan uang, sehingga meningkatkan produktivitas Anda. Sekarang adalah waktu terbaik dalam sejarah untuk menciptakan sesuatu yang berguna bagi umat manusia dengan tim kecil (atau hanya dengan upaya satu orang), menggunakan teknologi sederhana dan membosankan.

Seiring waktu, perusahaan menjadi semakin kecil. Tidak perlu lagi mempekerjakan banyak karyawan penuh waktu. Untuk melakukan semua pekerjaan, Anda dapat menggunakan layanan SaaS dan kontraktor untuk memesan.

Pada dasarnya, kendala utama dalam menciptakan sebuah proyek adalah pemikiran yang berlebihan. Bagaimana jika itu, bagaimana jika itu. Wah, tidak ada yang membutuhkanmu. Semua orang sibuk dengan urusannya sendiri. Tidak ada yang tertarik pada Anda dan proyek Anda sampai Anda membuktikan bahwa Anda layak diperhatikan. Bahkan jika Anda mengunci peluncuran, tidak ada yang akan melihat. Berpikir besar, mulai dari yang kecil, bertindak cepat. Benar-benar normal untuk menggunakan teknologi yang membosankan dan mulai dengan sesuatu yang sederhana (bahkan jelek) jika Anda benar-benar menyelesaikan masalah.


Sekarang ada begitu banyak orang dengan kultus kargo . Abaikan kebisingan. Tetap tenang dan jangan brengsek.

Source: https://habr.com/ru/post/id467793/


All Articles