TechForge’s new guide warns that many fledgling microservices projects end up as “distributed monoliths,” delivering the latency of network calls without any scaling benefits. The piece urges engineering teams to start with a solid monolith and only break it apart when clear scaling or ownership needs arise.
Mengapa pasukan terburu-buru beralih ke mikroperkhidmatan
Daya tarikan mikroperkhidmatan adalah jelas: perkhidmatan bebas, deployment berasingan, dan janji untuk menskalakan setiap bahagian aplikasi mengikut keperluan tersendiri. Budaya syarikat pemula (start-up) dan kisah kejayaan baru-baru ini telah menjadikan corak ini sebagai lambang kejuruteraan moden. Namun, memecahkan monolit terlalu awal sering kali mewujudkan jenis monolit baharu—puluhan komponen rangkaian. Kosnya? Kependaman yang lebih tinggi, penyahpepijatan yang lebih sukar, dan lebih banyak beban operasi, manakala manfaat asalnya tetap sukar dicapai.
Kesilapan pertama: bermula dengan monolit hanya pada nama sahaja
Pasukan sering melabelkan sesuatu sistem sebagai "berasaskan mikroperkhidmatan" walaupun masih mengekalkan satu kod asas (codebase) dan pangkalan data kongsi. Hasilnya ialah siri modul yang terikat rapat (tightly coupled) yang masih berkomunikasi antara satu sama lain melalui HTTP atau RPC. Panduan tersebut menggelarnya sebagai "monolit teragih." Titik kesukaran yang dihadapi adalah sama dengan monolit tradisional—ikatan rapat dan kesukaran mengubah satu bahagian tanpa menjejaskan bahagian lain—ditambah pula dengan kependaman tambahan daripada lompatan rangkaian (network hops).
Apa yang perlu dilakukan sebagai ganti: Bina monolit yang bersih terlebih dahulu. Tetapkan sempadan modul yang jelas, kekalkan lapisan data yang bersatu, dan pastikan aplikasi boleh diuji dan digunakan sebagai satu unit tunggal. Ekstrak modul ke dalam perkhidmatannya sendiri hanya apabila ia memerlukan penskalaan bebas atau pemilikan pasukan yang berasingan.
Memecah mengikut lapisan teknikal berbanding keupayaan perniagaan
Satu lagi kesilapan yang kerap berlaku ialah membahagikan perkhidmatan mengikut keperluan teknikal—UI, logik perniagaan, atau akses data. Ini memaksa sesuatu permintaan (request) melalui rantaian perkhidmatan untuk satu operasi tunggal, yang meningkatkan masa tindak balas dan mewujudkan graf kebergantungan yang rapuh.
Pendekatan yang lebih baik: Atur perkhidmatan berdasarkan keupayaan perniagaan seperti "pesanan," "pembayaran," atau "inventori." Biarkan setiap keupayaan memiliki datanya sendiri dan API sendiri, sekali gus menghapuskan keperluan untuk permintaan melompat merentasi lapisan.
Pemilikan data adalah penting
Apabila dua perkhidmatan menulis ke jadual pangkalan data yang sama, mereka tidak lagi bebas. Panduan tersebut menegaskan bahawa sesuatu perkhidmatan tidak boleh melakukan pertanyaan (query) pada jadual perkhidmatan lain secara langsung; ia harus sentiasa melalui API awam perkhidmatan tersebut. Berkongsi pangkalan data mengikat perkhidmatan bersama, menjejaskan pengasingan, dan menjadikan perubahan skema sebagai mimpi ngeri penyelarasan.
HTTP segerak (synchronous) bukanlah penyelesaian universal
Bergantung pada HTTP segerak untuk setiap interaksi menjadikan keseluruhan sistem terdedah kepada satu perkhidmatan yang perlahan. Jika Perkhidmatan A menunggu Perkhidmatan B memberi maklum balas sebelum kembali kepada pelanggan, sebarang kelembapan dalam B akan merebak ke A dan akhirnya kepada pengguna.
Corak alternatif: Gunakan pemesejan tidak segerak (asynchronous) untuk tugas yang tidak memerlukan jawapan segera. Barisan mesej (message queues) atau tugasan latar belakang membolehkan perkhidmatan menyerahkan kerja dan terus memproses, menjadikan keseluruhan sistem lebih berdaya tahan.
Menerima ketekalan akhirnya (eventual consistency)
Pangkalan data hubungan tradisional memberikan anda transaksi ACID—Atomicity, Consistency, Isolation, Durability. Merentasi sempadan perkhidmatan, jaminan tersebut hilang. Cuba memaksa komit dua fasa (two-phase commits) (protokol yang cuba menjadikan transaksi teragih berkelakuan seperti transaksi tempatan) membawa kepada kerumitan dan ketidakstabilan.
Panduan tersebut mengesyorkan saga (siri tindakan pampasan) atau corak outbox (di mana perkhidmatan menulis acara ke jadual tempatan yang kemudiannya diterbitkan). Pendekatan ini mengakui bahawa data mungkin tidak selaras buat sementara waktu dan mereka bentuk logik perniagaan untuk mengendalikan jurang tersebut.
Bina untuk kegagalan dari hari pertama
Pepijat dalam satu perkhidmatan tidak sepatutnya melumpuhkan keseluruhan sistem. Laksanakan tempoh tamat (timeouts) untuk mengelakkan menunggu selama-lamanya, cubaan semula dengan back-off untuk mengendalikan kegagalan sementara, dan pemutus litar (circuit breakers) yang menghentikan panggilan ke perkhidmatan yang gagal sehingga ia pulih. Menambah perlindungan ini selepas gangguan pengeluaran (production outage) adalah sudah terlambat; ia sepatutnya ada dalam reka bentuk awal.
Kebolehperhatian (Observability) adalah perkara yang tidak boleh dirunding
Menyahpepijat sistem teragih dengan log yang bertaburan di pelbagai kontena adalah hampir mustahil. Log berpusat, metrik terkumpul, dan ID korelasi tahap permintaan membolehkan jurutera menjejaki satu permintaan pengguna semasa ia bergerak melalui pelbagai perkhidmatan. Alat penjejakan (tracing tools) memvisualisasikan graf panggilan, menjadikan kesesakan prestasi dan kegagalan lebih mudah dikesan.
Kekalkan infrastruktur yang ringan pada permulaan
Kubernetes, while powerful, brings a steep learning curve and operational overhead. For a handful of services, Docker Compose provides enough orchestration to spin up the entire stack locally. Only when traffic patterns, deployment frequency, or team size demand it should a more complex platform be introduced.
Align services with team ownership
Microservices were partly invented to let small, autonomous teams own the full lifecycle of a service. If a single team is responsible for ten services, coordination costs rise dramatically, eroding the intended benefits. The guide suggests that teams of fewer than ten people may be better served by a monolith, preserving simplicity while still allowing modular development.
The counter-argument: when microservices shine
The guide does not claim that microservices are inherently bad. In environments where different parts of an application have wildly different scaling requirements, or where regulatory constraints demand strict data isolation, the pattern can provide real value. Large organizations with multiple product lines often find that independent services reduce cross-team friction and enable faster release cycles.
The key is intentionality. If a team adopts microservices because they need to handle millions of requests per second for a specific feature, or because a new product line must be owned by a separate business unit, the added complexity is justified. The guide’s warnings target cases where the decision is driven by hype rather than concrete requirements.
What to watch for next
As more companies adopt cloud-native stacks, tooling around service mesh, distributed tracing, and automated canary deployments continues to mature. These advances lower the operational barrier but do not eliminate the fundamental design choices highlighted in the guide. Teams should monitor the evolution of observability platforms and async messaging frameworks, but still start with a clear justification for each service they spin up.
Takeaway
Microservices are a means to an end, not an end in themselves. Begin with a well-structured monolith, give each service true ownership of its data, use asynchronous communication where possible, and embed resilience and observability from the first line of code. When the business case is clear, break out services deliberately; otherwise, keep the architecture as simple as the problem demands.
