Gần đây, chúng tôi đã bắt đầu một dự án nhỏ nhằm cải thiện cách các bộ phận trong hệ thống của chúng tôi giao tiếp ngầm tại Buffer. Một số bối cảnh nhanh: chúng tôi sử dụng thứ gọi là SQS (Dịch vụ xếp hàng đơn giản của Amazon. Những hàng đợi này hoạt động giống như phòng chờ thực hiện nhiệm vụ. Một phần trong hệ thống của chúng tôi gửi tin nhắn và phần khác sẽ nhận nó sau. Hãy nghĩ về việc này giống như để lại một ghi chú cho đồng nghiệp: "Này, khi bạn có cơ hội, hãy xử lý dữ liệu này". Hệ thống gửi ghi chú không cần phải đợi phản hồi. Dự án của chúng tôi là thực hiện bảo trì định kỳ: cập nhật các công cụ mà chúng tôi sử dụng để kiểm tra cục bộ các hàng đợi và dọn dẹp cấu hình của chúng. Nhưng trong khi vạch ra những hàng đợi mà chúng tôi thực sự sử dụng, chúng tôi đã tìm thấy một điều mà chúng tôi không mong đợi: bảy quy trình nền khác nhau (hoặc các công việc định kỳ, là các tác vụ được lên lịch chạy tự động) và các công cụ đã hoạt động âm thầm trong tối đa 5 năm. Tất cả chúng đều hoàn toàn không có tác dụng gì. Đây là lý do tại sao điều đó quan trọng, cách chúng tôi tìm thấy chúng và những gì chúng tôi đã làm với nó. đã tính toán nhanh và đối với một trong những công nhân đó, chúng tôi sẽ phải trả khoảng 360-600 USD trong 5 năm. Đây là một số tiền khiêm tốn trong kế hoạch tài chính lớn của chúng tôi, nhưng chắc chắn là lãng phí cho một quy trình không mang lại hiệu quả gì. Tuy nhiên, sau khi trải qua quá trình dọn dẹp này, tôi cho rằng chi phí tài chính thực sự là phần nhỏ nhất của vấn đề. Mỗi khi một kỹ sư mới gia nhập nhóm và khám phá hệ thống của chúng tôi, họ sẽ gặp phải những quy trình bí ẩn này, "Công nhân này làm gì sẽ trở thành một câu hỏi tiêu tốn thời gian làm quen" và Tất cả chúng ta đều đã ở đó — nhìn chằm chằm vào một đoạn mã, ngại chạm vào nó vì có thể nó đang thực hiện điều gì đó quan trọng. Ngay cả cơ sở hạ tầng "bị lãng quên" đôi khi cũng cần được chú ý. Điều này thật dễ dàng để chỉ ra, nhưng sự thật là điều này xảy ra một cách tự nhiên trong bất kỳ hệ thống tồn tại lâu dài nào. Một tính năng không còn được dùng nữa, nhưng công việc nền hỗ trợ nó vẫn tiếp tục chạy. Ai đó đã cử một nhân viên "tạm thời" để xử lý việc di chuyển và nó không bao giờ bị hủy bỏ. Một tác vụ đã lên lịch sẽ trở nên dư thừa sau khi thay đổi kiến trúc, nhưng không ai nghĩ đến việc kiểm tra. Để thực hiện việc này, chúng tôi đã chạy một tác vụ đã lên lịch để kiểm tra toàn bộ cơ sở dữ liệu về các ngày sinh phù hợp với ngày hiện tại và gửi cho khách hàng một email được cá nhân hóa. Trong quá trình tái cấu trúc email vào năm 2020, chúng tôi đã chuyển đổi công cụ email giao dịch của mình nhưng lại quên xóa công cụ này—nó vẫn tiếp tục hoạt động trong 5 năm nữa. Không có lỗi nào trong số này là lỗi của các cá nhân — chúng là lỗi của quy trình nếu không có sự dọn dẹp có chủ ý được tích hợp trong cách chúng tôi làm việc, thì entropy sẽ thắng. Cách kiến trúc của chúng tôi đã giúp chúng tôi tìm ra nó Giống như nhiều công ty, Buffer đã đón nhận phong trào dịch vụ vi mô (một cách tiếp cận phổ biến trong đó các công ty chia mã của họ thành nhiều dịch vụ nhỏ, độc lập) từ nhiều năm trước. Chúng tôi chia khối nguyên khối của mình thành các dịch vụ riêng biệt, mỗi dịch vụ có dịch vụ riêng. Kho lưu trữ, quy trình triển khai và cơ sở hạ tầng vào thời điểm đó là điều hợp lý: mỗi dịch vụ có thể được triển khai riêng, với ranh giới rõ ràng giữa các nhóm. Nhưng qua nhiều năm, chúng tôi nhận thấy chi phí quản lý hàng chục kho lưu trữ lớn hơn lợi ích đối với quy mô của một nhóm. Vì vậy, chúng tôi đã hợp nhất thành một kho lưu trữ đa dịch vụ duy nhất, nhưng chúng tồn tại ở cùng một nơi. được các kỹ sư làm việc ở một nơi khác chú ý. Không có nơi duy nhất để tìm kiếm tên hàng đợi, không có chế độ xem thống nhất về những gì đang chạy ở đâu. Với mọi thứ trong một kho lưu trữ, cuối cùng chúng tôi có thể xem được bức tranh đầy đủ. Chúng tôi có thể theo dõi mọi hàng đợi đến người tiêu dùng và nhà sản xuất của nó. Chúng tôi có thể phát hiện hàng đợi với các nhà sản xuất nhưng không tìm thấy người tiêu dùng nào đang tham chiếu đến các hàng đợi không còn tồn tại. Việc hợp nhất không được thiết kế để giúp chúng tôi tìm thấy cơ sở hạ tầng zombie — nhưng nó đã làm được điều đó.việc khám phá gần như không thể tránh khỏi. Chúng tôi thực sự đã làm gì Khi xác định được các quy trình đơn lẻ, chúng tôi phải quyết định phải làm gì với chúng. Đây là cách chúng tôi tiếp cận nó. Đầu tiên, chúng tôi truy tìm nguồn gốc của từng cái. Chúng tôi đã tìm hiểu lịch sử git và tài liệu cũ để hiểu lý do tại sao mỗi công nhân được tạo ngay từ đầu. Trong hầu hết các trường hợp, mục đích ban đầu rất rõ ràng: di chuyển dữ liệu một lần, một tính năng đã ngừng hoạt động, một giải pháp tạm thời không còn hữu ích nữa. Sau đó, chúng tôi xác nhận rằng chúng thực sự không được sử dụng. Trước khi xóa bất kỳ nội dung nào, chúng tôi đã thêm tính năng ghi nhật ký để xác minh rằng các quy trình này không âm thầm thực hiện điều gì đó quan trọng mà chúng tôi đã bỏ lỡ. Chúng tôi đã theo dõi trong vài ngày để đảm bảo rằng chúng hoàn toàn không được gọi và chúng tôi đã loại bỏ chúng dần dần. Chúng tôi đã không xóa mọi thứ cùng một lúc. Chúng tôi loại bỏ từng quy trình một, theo dõi mọi tác dụng phụ không mong muốn. (May mắn thay, không có cái nào cả.) Cuối cùng, chúng tôi đã ghi lại những gì mình đã học được. Chúng tôi đã thêm ghi chú vào tài liệu nội bộ của mình về những gì từng quy trình đã thực hiện ban đầu và lý do xóa quy trình đó, để các kỹ sư trong tương lai sẽ không thắc mắc liệu có thiếu thứ gì đó quan trọng hay không. Điều gì đã thay đổi sau khi dọn dẹp Chúng tôi vẫn còn sớm trong việc đo lường toàn bộ tác động, nhưng đây là những gì chúng tôi đã thấy cho đến nay. Kiểm kê cơ sở hạ tầng của chúng tôi hiện đã chính xác. Khi ai đó hỏi, "Chúng tôi điều hành những công nhân nào?" chúng tôi thực sự có thể tự tin trả lời câu hỏi đó. Các cuộc trò chuyện giới thiệu cũng trở nên đơn giản hơn. Các kỹ sư mới không gặp phải các quy trình bí ẩn và tự hỏi liệu họ có thiếu bối cảnh hay không. Cơ sở mã phản ánh những gì chúng tôi thực sự làm, chứ không phải những gì chúng tôi đã làm cách đây 5 năm. Hãy coi các công cụ tái cấu trúc như khảo cổ học và phòng ngừa. Bài học rút ra lớn nhất của tôi từ dự án này: mọi công cụ tái cấu trúc quan trọng đều là một cơ hội cho khảo cổ học. Khi bạn đi sâu vào một hệ thống, thực sự hiểu cách các phần kết nối với nhau, bạn đang ở vị trí hoàn hảo để đặt câu hỏi về những gì vẫn cần thiết. Hàng đợi đó từ một số dự án cũ? Công nhân mà ai đó đã tạo để di chuyển dữ liệu một lần? Tác vụ đã lên lịch tham chiếu đến một tính năng mà bạn chưa từng nghe tới? Chúng có thể vẫn đang chạy. Đây là những gì chúng tôi đang xây dựng trong quy trình sắp tới của mình: Trong bất kỳ quá trình tái cấu trúc nào, hãy hỏi: điều gì khác chạm vào hệ thống này mà chúng tôi đã không xem xét trong một thời gian? Khi ngừng sử dụng một tính năng, hãy theo dõi nó đến tận các quy trình nền của nó chứ không chỉ mã giao diện người dùng. Khi ai đó rời nhóm, hãy ghi lại những gì họ phụ trách, đặc biệt là những thứ chạy trong nền. Chúng tôi vẫn có các phần cũ hơn trong cơ sở mã chưa được di chuyển sang một kho lưu trữ duy nhất. Khi chúng tôi tiếp tục củng cố, chúng tôi tin tưởng rằng chúng tôi sẽ tìm thấy thêm những di tích ẩn giấu này. Nhưng bây giờ chúng tôi đã sẵn sàng để phát hiện chúng và ngăn chặn những mã mới hình thành. Khi tất cả mã của bạn tập trung ở một nơi, cơ sở hạ tầng mồ côi sẽ không còn nơi nào để ẩn náu.
Chúng tôi học được gì sau khi tìm thấy 7 công việc bị lãng quên suốt 5 năm
By Social Media
·
·
6 min read
·
698 views
Read in:
aa
ace
af
ak
alz
am
ar
as
awa
ay
az
ba
ban
be
bew
+191 more
bg
bho
bik
bm
bn
brx
bs
bug
ca
ceb
cgg
ckb
co
crh
cs
cv
cy
da
de
din
doi
dv
dyu
dz
ee
el
en
eo
es
et
eu
fa
ff
fi
fj
fo
fr
fur
fy
ga
gd
gl
gom
gn
gu
ha
haw
he
hi
hil
hne
hmn
hr
hrx
ht
hu
hy
id
ig
ilo
is
it
ja
jam
jv
ka
kab
kbp
kg
kha
kk
kl
km
kn
ko
kri
ku
ktu
ky
la
lb
lg
li
lij
ln
lo
lmo
lt
ltg
lua
luo
lus
lv
mai
mak
mg
mi
min
mk
ml
mn
mni-mtei
mos
mr
ms
mt
my
nd
ne
nl
nn
no
nr
nso
nus
ny
oc
om
or
pa
pag
pam
pap
pl
ps
pt
pt-br
qu
rn
ro
ru
rw
sa
sah
sat
sc
scn
sg
si
sk
sl
sm
sn
so
sq
sr
ss
st
su
sus
sv
sw
szl
ta
tcy
te
tg
th
ti
tiv
tk
tl
tn
to
tpi
tr
trp
ts
tt
tum
ty
udm
ug
uk
ur
uz
ve
vec
vi
war
wo
xh
yi
yo
yua
yue
zap
zh
zh-hk
zh-tw
zu