Triển khai BitTorrent tracker mới được viết bằng Elixir
(github.com/Dahrkael)- ExTracker là một dự án BitTorrent tracker mới dựa trên Elixir
- Được thiết kế dựa trên hiệu năng cao và mức sử dụng bộ nhớ thấp, đồng thời có thể dùng ngay gần như không cần thiết lập
- Cung cấp tính đa dạng và khả năng tương thích nhờ hỗ trợ nhiều đề xuất mở rộng của giao thức BitTorrent (BEP)
- Bao gồm các tính năng quan trọng cho vận hành thực tế như hỗ trợ HTTPS, sao lưu lên đĩa, tính năng quản trị vận hành
- Hiện vẫn chưa hoàn thiện để dùng trong môi trường công nghiệp, nhưng một instance thử nghiệm đang chạy thực tế
Tổng quan và tầm quan trọng của dự án
ExTracker là một dự án mã nguồn mở BitTorrent tracker mới được triển khai bằng Elixir, mang lại các lợi thế sau so với những tracker hiện có
- Dựa trên runtime Erlang/Elixir hiện đại, có kiến trúc hiệu năng cao tận dụng toàn bộ đa lõi
- Bảo đảm mức sử dụng bộ nhớ thấp trong môi trường peer quy mô lớn (khoảng 200MB RAM cho mỗi 1 triệu peer)
- Cung cấp môi trường zero-setup có thể chạy ngay lập tức mà không cần cấu hình phức tạp từ trước
- Duy trì khả năng tương thích với các tiêu chuẩn tracker mới nhất nhờ hỗ trợ nhiều BitTorrent Enhancement Proposal (BEP)
So với các tracker hiện có, dự án này nhẹ hơn và hiệu quả hơn, đồng thời tận dụng tối đa khả năng hỗ trợ đồng thời và môi trường phân tán đặc trưng của Elixir để tạo khác biệt với các dự án mã nguồn mở cùng hạng
Tính năng chính (Features)
- Hiệu năng cao: tận dụng mọi lõi CPU, sử dụng lưu trữ in-memory
- Tối ưu bộ nhớ: dùng khoảng 200MB RAM cho mỗi 1 triệu peer
- Zero-setup: có thể chạy ngay mà không cần thêm bất kỳ cấu hình nào
Các BitTorrent Enhancement Proposals (BEP) được hỗ trợ
- BEP 0: tuân thủ đặc tả giao thức BitTorrent
- BEP 15: hỗ trợ giao thức UDP tracker
- BEP 23: trả về danh sách peer dạng nén
- BEP 7: mở rộng tracker IPv6
- BEP 24: trả về IP bên ngoài
- BEP 41: mở rộng giao thức UDP tracker
- BEP 48: mở rộng Scrape tracker (hỗ trợ một phần)
- BEP 52: giao thức BitTorrent v2
- Một số tính năng (BEP 27, 21, 31, v.v.) vẫn chưa được triển khai hoặc đang được lên kế hoạch
- Không hỗ trợ BEP 8 (obfuscation peer của tracker)
Các tính năng khác
- Hỗ trợ kết nối HTTPS
- Sao lưu lên đĩa (tăng cường an toàn dữ liệu)
- (Dự kiến) quản lý whitelist/blacklist Infohash
- (Dự kiến) quản lý peer: quyền hạn, dọn dẹp định kỳ, trục xuất, v.v.
- (Dự kiến) quản lý metrics/chỉ số và tận dụng GeoIP
- Không có kế hoạch hỗ trợ WebTorrent
Nhận các đề xuất từ người dùng/nhà phát triển qua Issue
Cách chạy
- Chạy trực tiếp từ mã nguồn
- Cần Erlang và Elixir
- Clone kho lưu trữ, sau đó cấu hình môi trường và chạy
- Theo cách release
- Chưa có bản phát hành chính thức, nhưng hỗ trợ tự build và triển khai
- Sao chép tệp release, cấu hình môi trường rồi chạy
- Docker
- Có thể dùng image container chính thức
- Cung cấp tệp ví dụ
docker-compose - Khuyến nghị dùng biến môi trường để cấu hình bên trong container
Bản quyền và giấy phép
- Copyright (c) Dahrkael <dahrkael at outlook dot com>
- Phân phối theo Apache License 2.0
- Xem chi tiết giấy phép trong tệp LICENSE của kho lưu trữ
1 bình luận
Ý kiến Hacker News
Thấy hơi tiếc vì đã kỳ vọng vào một thiết kế xoay quanh OTP, nhưng mã thực tế lại gần như mang tính thủ tục, phải tự xử lý trực tiếp ETS hay các hệ thống dựa trên ETS như Application mỗi lần
Nếu tác giả muốn học cách thiết kế dịch vụ trong Elixir hoặc các ngôn ngữ BEAM thì xin gợi ý hai cuốn tham khảo là "Designing Elixir Systems with OTP" của James Edward Gray và Bruce Tate, cùng "Functional Web Development with Elixir, OTP, and Phoenix" của Lance Halvorsen
Torrent tracker rốt cuộc là một cơ sở dữ liệu chuyên biệt, nên mục tiêu quan trọng nhất là xử lý dữ liệu nhanh nhất có thể
Dù vậy tôi chắc chắn sẽ đọc những cuốn sách bạn gợi ý
Tôi nghĩ có một điều gì đó khiến các lập trình viên C++ rất thích Go và Elixir
Bản thân tôi cũng như vậy
Ý là những người yêu C++ vì hiệu năng rồi cũng sẽ mê hiệu năng đa luồng của Go hay Elixir
Một ý kiến tích cực rằng đây là dự án rất hay
Pattern matching làm giảm phần lớn các nhánh xử lý và độ phức tạp của mã, nên code trở nên sạch hơn rất nhiều
Nhờ triết lý 'Let it crash', bạn có thể bỏ qua phần lớn các trường hợp ngoại lệ mà vẫn tin rằng nếu có vấn đề thật sự xảy ra thì ảnh hưởng cũng chỉ giới hạn ở một client
Trong hơn 10 năm triển khai ứng dụng bằng Elixir, tôi chưa từng gặp downtime ngoài ý muốn
Ngoài bảo trì và cập nhật ra thì nó luôn đạt 100% uptime
Với khách hàng, tôi thường nói rằng “dịch vụ làm bằng Elixir thay vì Python hay Go không chỉ gần như không bao giờ chết mà còn có dashboard rất đẹp”, và thực tế nhiều người bị thuyết phục ngay lập tức
Tôi ước gì có một ngôn ngữ hệ thống hỗ trợ struct, enum và pattern matching ngay trong chữ ký hàm giống như Elixir
Tôi cũng từng làm việc tương tự bằng Typescript để học BT (BitTorrent)
Sau đó tôi viết lại bằng Rust và cũng nhờ đó học thêm Rust
Link dự án của tôi
Tôi chỉ dùng redis làm cơ sở dữ liệu, nhưng việc bên bạn đưa toàn bộ vào bộ nhớ để chạy khá thú vị
Tò mò không biết trong kiểu thiết kế này có những băn khoăn, quyết định thú vị hay vấn đề gì đáng kể không
Nhân tiện, giải pháp dựa trên redis của tôi có vấn đề là khi announce nhiều lần thì peer không phải lúc nào cũng được xáo trộn ngẫu nhiên
Dữ liệu của từng peer có thể được đọc và ghi đồng thời từ các process riêng biệt, nên mức tranh chấp và độ trễ là tối thiểu
Phần duy nhất mang tính tuần tự là khi một swarm mới được tạo lần đầu, nhưng việc đó không xảy ra thường xuyên nên ổn
Tiếc là không có hỗ trợ gốc để lấy ngẫu nhiên các hàng trong bảng, nên hiện tại tôi phải nạp toàn bộ swarm rồi tự chọn một tập con ngẫu nhiên
Ví dụ mã liên quan
Tôi nghĩ đây là một dự án rất hay
Trước đây tôi cũng từng làm một tracker cơ bản bằng Elixir
Link code của tôi
Đặc biệt tôi tò mò vì sao lại triển khai nó như một private tracker
Chúc mừng ra mắt dự án
Tôi muốn biết thêm chi tiết như cách nó hoạt động và hiệu năng so với opentracker
Tuy nhiên, extracker thực sự phát huy khi số lõi CPU lên tới hai chữ số
Hiện tại tôi vẫn chưa chạy benchmark tử tế
Một lời khen rằng đây là dự án được làm rất tốt
Nếu góp ý ngắn gọn thì nên chuyển từ IO.puts sang Logger, và cũng nên cân nhắc thêm OTel
Đồng ý với ý này
Chỉ dùng Logger tích hợp sẵn và ứng dụng Telemetry thôi cũng đã đủ
Sau này có thể dễ dàng gắn thêm opentelemetry hoặc thứ khác thông qua các hook của Telemetry
Logger documentation
Telemetry documentation
Bạn thích otel sink nào hơn, tức là gửi metric đi đâu?
Tôi thực sự rất thích Elixir
Hiện tôi đang phát triển một notification engine rất ngầu bằng Elixir
Elixir thật sự quá xuất sắc
Đó là dự án private hay OSS (mã nguồn mở)?
Hệ sinh thái Elixir đang rất cần một notification engine tốt hơn
Có dự án nào để tham khảo không?
Mất bao lâu để phát triển?
So với qbittorrent thì hiện có khoảng bao nhiêu tính năng hoạt động?
Tôi bắt đầu vì cần một tracker để dùng trong dự án khác, nhưng rồi việc phát triển tracker lại thú vị hơn nên cứ tiếp tục làm
Tôi có tham khảo code của các tracker khác, nhưng phần lớn либо quá phức tạp либо quá đơn giản nên không tham khảo được nhiều
Tính đến giờ thì tôi đã phát triển được 3 tháng, qua nhiều đêm thức trắng code
Nó không phải client như qbittorrent, nhưng về sau tôi cũng có ý tưởng cho một dự án client thiên về seedbox
Giải thích rằng tracker không phải là torrent client
Tôi đã thử dùng trực tiếp nhưng gặp vấn đề HTTPS không hoạt động đúng
Ngoài ra trên console liên tục hiện cảnh báo
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"
Tuy vậy có vẻ nó vẫn hoạt động
Tôi cũng muốn xem thống kê HTTP, nhưng chỉ thấy thống kê UDP
(Tôi đang tắt UDP)
Sự kiện "paused" là một phần của BEP 21, dùng để báo cho tracker rằng client vẫn chưa hoàn tất nhưng cũng không còn tải xuống nữa
Ví dụ nó hữu ích khi người dùng chỉ muốn một phần file trong torrent
README của dự án đó có ghi rõ là chưa hỗ trợ BEP 21
Telemetry liên quan tới HTTP vẫn còn nằm trong danh sách ToDo
Tôi đang dùng thư viện bên thứ ba làm web server nên vẫn phải suy nghĩ thêm về cách tích hợp phù hợp
Muốn dùng HTTPS thì cần chỉ định đường dẫn chứng chỉ hợp lệ trong
:https_keyfileHiện tại nếu muốn HTTPS thì tôi khuyên nên đặt Caddy hoặc Nginx phía trước tracker
Tôi cũng có kế hoạch tích hợp certbot, nhưng vì phần lớn torrent peer dùng UDP nên mức ưu tiên hiện chưa cao
Một lời khen rằng đây là dự án thật sự rất hay
Hỏi liệu bạn có định dùng Elixir làm ngôn ngữ chính không
Elixir là một trong những lựa chọn chủ lực của tôi
Cá nhân tôi tin rằng làm việc với nó chắc chắn thú vị hơn C++ rất nhiều
Tôi thì không, nhưng đã làm việc với Elixir gần 9 năm 2 tháng, đồng thời cũng biết Rust và Golang
Không biết hiện tại có ai đang tuyển dụng không?