Tôi Xây Dựng Hệ Thống Ngân Hàng Kết Nối COBOL... Và Sếp Tôi Không Nhận Ra
Làm thế nào tôi tránh được một cuộc di cư 5 năm chỉ với 40 dòng C và một thủ thuật daemon Unix
Tôi từng nghĩ rằng "daemon" có nghĩa là quỷ—cho đến tối qua khi tôi kết nối một mainframe từ những năm 1960 vào một bảng điều khiển React mà không cần khởi động lại bất kỳ công việc nào.
Dưới đây là câu chuyện 3 phút (và tệp C 40 dòng) giúp tôi rời văn phòng trước nửa đêm.
Vấn Đề Khiến Tôi Thức Đêm
Quy trình chuyển tiền chính của chúng tôi vẫn là một JOB card COBOL. Mỗi đêm lúc 02:00, nó:
- Đọc một tệp VSAM
- Gọi
DFH$MONEY
(CICS) - In một báo cáo JES dài 400 trang
Yêu cầu mới: Phơi bày nó như một endpoint REST để front-end fintech có thể kích hoạt theo yêu cầu.
Ràng buộc: Không được ngừng hoạt động, không thay đổi JCL, không có ngân sách.
Tài nguyên: Một thực tập sinh (tôi), một Red Bull, một MacBook.
Thủ Thuật Daemon Unix Không Ai Nói Đến
Điều khiến tôi bất ngờ là: một daemon không phải là ma thuật—nó chỉ là một tiến trình double-forks để terminal có thể tắt mà không làm nó ngừng hoạt động.
Khi bạn chạy một chương trình bình thường:
bash
$ ./my-service
# Đóng terminal = dịch vụ chết 💀
Dịch vụ của bạn là một con cái của shell của bạn. Giết cha, giết con. Đó là di truyền học Unix cơ bản.
Nhưng một daemon? Nó cắt đứt dây rốn:
c
pid_t pid = fork();
if (pid > 0) exit(0); // Cha ra đi
setsid(); // Phiên mới, cuộc sống mới
pid = fork(); // Fork lại (tin tôi đi)
if (pid > 0) exit(0);
// Giờ chúng ta bất tử 🚀
Vũ Khí 40 Dòng
Thay vì viết lại hàng triệu dòng COBOL, tôi đã xây dựng một cây cầu nhỏ:
c
// main.c – libpolycall-cobol FFI
char *cobol_job_invoke(const char *jcl_path, const char *parm){
static char reply[65536];
char cmd[1024];
snprintf(cmd, sizeof(cmd),
"tsocmd 'submit %s parm(%s)' 2>&1",
jcl_path, parm ? parm : "");
FILE *fp = popen(cmd, "r");
size_t n = fread(reply, 1, sizeof(reply)-1, fp);
pclose(fp);
reply[n] = '\0';
return reply;
Nhập chế độ toàn màn hình Thoát chế độ toàn màn hình
}
Biên dịch → libpolycall-cobol.so
→ thả vào /usr/lib/polycall/
→ xong.
Không cần quyền root. Không cần biên dịch lại mã nguồn kế thừa. Không cần cổng mới trên mainframe.
Pipeline Một-Makefile
Tôi đã đi toàn bộ polyglot và kết nối mọi ngôn ngữ vào một bản dựng duy nhất:
makefile all: driver cobol go python java lua node @echo "🚀 Tất cả các binding đã được biên dịch. DRIVER sẵn sàng trên cổng 3005→8085"
Một make all
thải ra:
libpolycall-cobol.so
← anh hùng của tối naylibpolycall-go.so
libpolycall-python.so
- Cộng với Java, Node, Lua...
Tất cả đều đăng ký với daemon C DRIVER cùng một. Một tiến trình, sáu ngôn ngữ, không cần cấu hình thủ công.
Buổi Trình Diễn Khiến Mọi Người Im Lặng
- Mở trình duyệt →
http://localhost:8084
- Kéo bất kỳ tệp .jcl nào vào vùng thả
- Nhấp "Gửi"
- Theo dõi JESMSGLG xuất hiện theo thời gian thực
Sếp: "Chờ đã... đó là JOB sản xuất của chúng ta?"
Tôi: "Đúng vậy, và tôi không động chạm vào bất kỳ PROC nào."
Sếp: [im lặng bối rối]
Tại Sao Điều Này Quan Trọng
"Hiện đại hóa" truyền thống có nghĩa là một cuộc viết lại 5 năm, 50 triệu đô kết thúc với sự cố cấp độ Chernobyl.
Chúng tôi vừa bên cạnh con quái vật:
- Di sản vẫn chạy không bị ảnh hưởng
- Các tính năng mới vận chuyển bằng Go/React/whatever
- Phục hồi =
pkill -f server.py
Và vì chúng tôi đã daemon hóa cầu nối, terminal có thể đóng, phiên SSH của tôi có thể chết, và DRIVER vẫn sẽ định tuyến các cuộc gọi REST vào JES lúc 02:00.
Không cần giám sát. Không quên nohup
. Không cần gõ &
trong hoảng loạn.
Bài Học Unix Thực Sự
Nếu dịch vụ của bạn chết khi bạn đóng laptop, bạn không có một dịch vụ—bạn có một đứa trẻ shell.
Thêm double-fork. Chuyển hướng stdout. Viết một tệp PID. Để cha thoát một cách thanh lịch.
Đó thực sự là tất cả những gì một daemon là. Không phải ma thuật của quỷ. Chỉ là làm cha tốt.
Điều Gì Tiếp Theo?
Tối nay tôi sẽ đổi drag-drop thành một GraphQL mutation để các bạn React có thể kích hoạt các giao dịch triệu đô với độ an toàn kiểu dữ liệu.
Đội ngũ vận hành mainframe vẫn nghĩ tôi "chỉ đang chạy thử nghiệm." 😇
Và libpolycall? Nó đang nhận được hỗ trợ --detach
chính thức. Bởi vì việc lấy mẫu ở chế độ gắn liền là dành cho các dịch vụ chưa trưởng thành.
Theo dõi tôi để có thêm nhiều khoảnh khắc "Tôi không thể tin rằng điều này vẫn đang vận hành thế giới". Hiện tại đang kết nối các dự án OBINexus khiến các hệ thống kế thừa cảm thấy như các chức năng không máy chủ.