Jika Anda tidak tinggal di gua, Anda mungkin tahu bahwa layanan mikro adalah arsitektur masa kini. Dengan perkembangan tren ini, produk Segment pada tahap awal
menerimanya sebagai praktik terbaik yang berfungsi dengan baik dalam beberapa kasus, dan, seperti yang akan segera Anda lihat, tidak begitu baik dalam hal lain.
Singkatnya, microservices adalah arsitektur perangkat lunak berorientasi-layanan di mana aplikasi sisi-server dibangun dengan menggabungkan banyak tugas tunggal, layanan jaringan minimal. Manfaat termasuk peningkatan modularitas, pengujian yang disederhanakan, komposisi fungsional yang lebih baik, isolasi lingkungan, dan otonomi tim pengembangan. Sebaliknya adalah arsitektur monolitik, di mana sejumlah besar fungsi terletak di satu layanan, di mana pengujian, penyebaran, dan penskalaan terjadi secara keseluruhan.
Pada awal 2017, kami mencapai titik kritis dengan sebagian besar
produk Segmen kami. Sepertinya kami jatuh dari pohon microservice, menabrak setiap cabang di jalan. Alih-alih berkembang lebih cepat, tim kecil terperosok dalam meningkatnya kompleksitas. Keuntungan signifikan dari arsitektur ini telah menjadi beban. Saat kecepatan kami turun, jumlah cacat meningkat.
Akibatnya, tim tidak dapat berhasil dengan tiga insinyur penuh waktu yang menghabiskan sebagian besar waktu mereka hanya mempertahankan sistem. Sesuatu harus berubah. Posting ini adalah kisah tentang bagaimana kami mengambil langkah mundur dan mengadopsi pendekatan yang sesuai dengan persyaratan dan kebutuhan tim kami.
Mengapa layanan microser berfungsi?
Infrastruktur data klien Segmen menerima ratusan ribu peristiwa per detik dan mengalihkannya ke API mitra, yang kami sebut tujuan sisi server. Ada lebih dari seratus jenis area ini, seperti Google Analytics, Optimizely, atau pengait web khusus.
Bertahun-tahun yang lalu, ketika produk awalnya diluncurkan, arsitekturnya sederhana. Ada API yang menerima acara dan mengirimnya ke antrian pesan yang didistribusikan. Acara dalam kasus ini adalah objek JSON yang dihasilkan oleh web atau aplikasi seluler yang berisi informasi tentang pengguna dan tindakan mereka. Contoh payload terlihat seperti ini:
{
"type": "identify",
"traits": {
"name": "Alex Noonan",
"email": "anoonan@segment.com",
"company": "Segment",
"title": "Software Engineer"
},
"userId": "97980cfea0067"
}
, , . API , , , – Segment API, , . Segment .
, . , . , , , . , HTTP 500, -. , , , , . , .

, , , ,
. , , ,
.
, X -. , , X, . , , . , X . , .

, . -, . , , , . , , , .

API , . – X
traits.dob
, API
traits.birthday
. X :
const traits = {}
traits.dob = segmentEvent.birthday
Segment, . , API . , , XML .
, , . , , . , . . , .
. .
50 50 . , , HTTP , .
, ,
event.name()
.
name
Name
. ,
firstName
,
first_name
,
FirstName
. , .
Identify.prototype.name = function() {
var name = this.proxy('traits.name');
if (typeof name === 'string') {
return trim(name)
}
var firstName = this.firstName();
var lastName = this.lastName();
if (firstName && lastName) {
return trim(firstName + ' ' + lastName)
}
}
. .
. . . , , . .
, . , . . , , .
, . , – . , .
, , - , .
, , , . , . .
140 . . , .
, . , , .
Centrifuge. Centrifuge .

, , , . , .
120 . . , .
, . , . .
, . , .
, . HTTP , , , .
, . , . , HTTP , . , . . , , .
HTTP . , . 5 . 140 .
Traffic Recorder. Traffic Recorder
yakbak, . , , . . , . , HTTP , .
, , Traffic Recorder. , 140+ . .
., . , . 140+ . .
. 2016, , 32 . 46. 6 , 2016 .
. , . , , .
, :
- . , , , . , . , , .
- . , , , . 3000+ , . - Redis , . , .
, . , . , . , .
, . , , , .
- . , , . , , .
- , , , . , .
. , , . .