Xây Dựng Công Cụ Tự Động Hóa LinkedIn: Hành Trình Khó Quên
Chào các bạn lập trình viên! 👋 Chúng tôi vừa ra mắt sản phẩm đầu tiên của mình - Post0, một công cụ tự động hóa LinkedIn. Hành trình kỹ thuật của chúng tôi thực sự là một cuộc phiêu lưu không tưởng. Trong bài viết này, tôi sẽ chia sẻ về cách chúng tôi đã từ "chỉ cần xây dựng một ứng dụng đơn giản" đến việc vô tình tạo ra một cơn ác mộng phân tán mà giờ đây vẫn hoạt động hiệu quả.
Bắt Đầu Đơn Giản
Chúng tôi bắt đầu như mọi sinh viên khác - với một kiến trúc monolith. Chỉ một repo, một lần triển khai, và một cơn đau đầu lớn đang chờ đợi. Chúng tôi còn trẻ, ngây thơ và nghĩ rằng "microservices chỉ là sự phức tạp không cần thiết của doanh nghiệp" 🤡.
post0-app/
├── frontend/
├── backend/
├── workers/
└── database/
Dễ dàng đúng không? SAI LẦM.
Khi Mọi Thứ Đổ Vỡ
Khoảng 3 tháng sau, quy trình CI/CD của chúng tôi bắt đầu mất hơn 20 phút. Các lần triển khai thường xuyên bị lỗi. Một lỗi nhỏ trong logic đăng bài có thể làm hỏng toàn bộ frontend. Những vấn đề điển hình của monolith đã ập đến như một cú đâm.
Điểm gãy là khi tôi đẩy một "sửa lỗi nhỏ" cho dịch vụ đăng bài và vô tình làm hỏng xác thực người dùng trong 2 giờ 💀.
Cuộc Di Cư Lớn (Chuyển Sang Microservices)
Chúng tôi quyết định chia nhỏ mọi thứ:
Kiến trúc hiện tại:
posting-service(24 commits) - xử lý tất cả các phép màu của LinkedIn API.notification-service(7 commits) - thông báo đẩy và email.frontend(162 commits) - ứng dụng next.js trông khá ổn.prisma-service(13 commits) - các schema cơ sở dữ liệu chung.
Kiến trúc sự kiện với mô hình pub-sub:
javascript
// khi người dùng lên lịch một bài viết
await pubsub.publish('post.scheduled', {
userId,
postContent,
scheduledTime,
platform: 'linkedin'
});
// dịch vụ đăng bài nhận nó
pubsub.subscribe('post.scheduled', async (data) => {
await scheduleLinkedInPost(data);
await pubsub.publish('post.status.updated', { ... });
});
Những Điểm Đau (Nơi Chúng Tôi Khóc)
Cơn Ác Mộng Đồng Bộ Hóa Schema Prisma
Chia sẻ schema prisma giữa các dịch vụ là... thú vị. Chúng tôi đã thử:
- Git submodules (không bao giờ nữa)
- Gói npm (vấn đề phiên bản)
- Monorepo (trở lại điểm khởi đầu?)
Cuối cùng, chúng tôi đã có một repo prisma-service riêng biệt để công bố các cập nhật schema. Không hoàn hảo nhưng vẫn hoạt động.
Vercel + Tổ Chức GitHub = 💸
Vercel không triển khai repo tổ chức ở mức miễn phí. Chúng tôi phải thiết lập các hành động GitHub để xây dựng và triển khai:
yaml
name: Deploy Frontend
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy to Vercel
uses: amondnet/vercel-action@v20
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.ORG_ID }}
Sự Hỗn Loạn Triển Khai Azure
Triển khai 4 dịch vụ riêng biệt vào Azure Container Instances trong khi duy trì các bí mật, biến môi trường mà không bị phá sản như sinh viên = hỗn loạn hoàn toàn.
Những Bài Học Đã Học (Một Cách Khó Khăn)
- Bắt đầu đơn giản, chia nhỏ khi cảm thấy đau - Monolith không sai từ đầu, chúng tôi chỉ lớn hơn nó.
- Kiến trúc dựa trên sự kiện thật đẹp nhưng việc gỡ lỗi các luồng bất đồng bộ lúc 3 giờ sáng thì không.
- Schema chia sẻ rất khó - không có giải pháp hoàn hảo, hãy chọn "độc dược" của bạn.
- Các gói miễn phí có giới hạn nhưng hành động GitHub + một chút sáng tạo có thể đi xa.
- Cam kết thường xuyên - 162 commits trong repo frontend đã cứu chúng tôi nhiều lần.
Tình Trạng Hiện Tại: Vẫn Hoạt Động Được ✨
- Tất cả các dịch vụ đã được triển khai trên Azure.
- Frontend trên Vercel (thông qua hack CI/CD của chúng tôi).
- Các sự kiện pub-sub đang hoạt động trơn tru.
- Người dùng thực sự đang lên lịch bài viết LinkedIn mà không bị nổ tung.
Nói Chuyện Thật
Liệu điều này có phải là phức tạp hóa cho một dự án sinh viên? Có thể.
Chúng tôi đã học được rất nhiều về hệ thống phân tán, kiến trúc dựa trên sự kiện, và hỗn loạn triển khai? Hoàn toàn.
Chúng tôi có làm lại không? Thành thật mà nói... có, nhưng sẽ lên kế hoạch tốt hơn 😅.
Nếu bạn đang xây dựng điều gì đó tương tự, lời khuyên của tôi là: bắt đầu với monolith, chia nhỏ khi bạn cảm thấy đau, và đừng ngại mắc sai lầm. Đó chính là cách bạn học được những điều này.
Dù sao, chúng tôi đã có mặt trên Product Hunt hôm nay nếu bạn muốn kiểm tra những gì đã đến từ thảm họa xinh đẹp này: [link]
Những Thất Bại Kiến Trúc Lớn Nhất Của Bạn Là Gì?
Hãy để lại trong phần bình luận, hãy cùng nhau chịu đựng nào! 🫡
Công Nghệ Đằng Sau:
- Next.js + TypeScript (frontend)
- Node.js + Express (services)
- Prisma + PostgreSQL
- Azure Pub/Sub + Container Instances
- GitHub Actions (CI/CD)
- Vercel (hosting frontend)
Post0
P/S: Nếu bạn cũng là sinh viên đang gặp phải những cơn ác mộng triển khai, hãy nhắn tin cho tôi. Hãy cùng khóc với nhau nào 😭