Chuyển đến nội dung

Lời Tựa

Trang này thuộc ấn bản thứ 1, ấn bản thứ 2 chưa có sẵn.

Nếu bạn đã làm việc trong lĩnh vực kỹ thuật phần mềm những năm gần đây, đặc biệt là ở phía server-side và backend, bạn chắc hẳn đã bị ngập trong hàng loạt thuật ngữ thời thượng liên quan đến lưu trữ và xử lý dữ liệu. NoSQL! Big Data! Web-scale! Sharding! Eventual consistency! ACID! CAP theorem! Cloud services! MapReduce! Real-time!

Trong thập kỷ qua, chúng ta đã chứng kiến nhiều bước phát triển thú vị trong cơ sở dữ liệu, hệ thống phân tán và cách chúng ta xây dựng ứng dụng trên đó. Có nhiều động lực thúc đẩy những bước phát triển này:

  • Các công ty internet như Google, Yahoo!, Amazon, Facebook, LinkedIn, Microsoft và Twitter đang xử lý khối lượng dữ liệu và lưu lượng truy cập khổng lồ, buộc họ phải tạo ra các công cụ mới cho phép xử lý ở quy mô đó một cách hiệu quả.
  • Doanh nghiệp cần linh hoạt, kiểm tra các giả thuyết với chi phí thấp và phản ứng nhanh với những nhận thức thị trường mới bằng cách giữ chu kỳ phát triển ngắn và mô hình dữ liệu linh hoạt.
  • Phần mềm miễn phí và nguồn mở đã thành công rất lớn và hiện được ưu tiên hơn phần mềm thương mại hay phần mềm nội bộ đặt làm riêng trong nhiều môi trường.
  • Tốc độ xung nhịp CPU hầu như không tăng nữa, nhưng bộ xử lý đa lõi đã trở thành tiêu chuẩn và mạng ngày càng nhanh hơn. Điều này có nghĩa là tính song song (parallelism) chỉ ngày càng tăng lên.
  • Ngay cả khi bạn làm việc trong một nhóm nhỏ, bạn giờ đây có thể xây dựng các hệ thống phân tán trên nhiều máy thậm chí nhiều khu vực địa lý, nhờ cơ sở hạ tầng dưới dạng dịch vụ (IaaS) như Amazon Web Services.
  • Nhiều dịch vụ hiện nay được kỳ vọng có tính sẵn sàng cao; thời gian ngừng hoạt động kéo dài do sự cố hay bảo trì ngày càng trở nên không thể chấp nhận.

Ứng dụng data-intensive (thâm dụng dữ liệu) đang mở rộng ranh giới của những gì có thể bằng cách tận dụng các bước phát triển công nghệ này. Chúng ta gọi một ứng dụng là data-intensive nếu dữ liệu là thách thức chính của nó - số lượng dữ liệu, độ phức tạp của dữ liệu, hay tốc độ thay đổi của nó - trái ngược với compute-intensive (thâm dụng tính toán), nơi các chu kỳ CPU là nút thắt cổ chai.

Các công cụ và công nghệ giúp các ứng dụng data-intensive lưu trữ và xử lý dữ liệu đã thích nghi nhanh chóng với những thay đổi này. Các loại hệ thống cơ sở dữ liệu mới (“NoSQL”) đã nhận được nhiều sự chú ý, nhưng hàng đợi tin nhắn (message queues), bộ nhớ cache, chỉ mục tìm kiếm (search indexes), các framework xử lý theo lô và theo luồng (batch and stream processing), cùng các công nghệ liên quan cũng rất quan trọng. Nhiều ứng dụng sử dụng một số kết hợp của những thứ này.

Những thuật ngữ thời thượng đang tràn ngập lĩnh vực này là dấu hiệu của sự nhiệt tình trước những khả năng mới, đó là điều tốt. Tuy nhiên, là những kỹ sư phần mềm và kiến trúc sư, chúng ta cũng cần có sự hiểu biết chính xác về mặt kỹ thuật về các công nghệ khác nhau và những đánh đổi của chúng nếu muốn xây dựng ứng dụng tốt. Để hiểu được điều đó, chúng ta phải đào sâu hơn những thuật ngữ bề mặt.

May mắn thay, đằng sau những thay đổi nhanh chóng của công nghệ, có những nguyên tắc bền vững vẫn đúng, dù bạn đang sử dụng phiên bản nào của một công cụ cụ thể. Nếu bạn hiểu những nguyên tắc đó, bạn sẽ ở vị trí nhìn thấy mỗi công cụ phù hợp ở đâu, cách sử dụng tốt và cách tránh những cạm bẫy của nó. Đó là lý do cuốn sách này ra đời.

Mục tiêu của cuốn sách này là giúp bạn điều hướng trong bức tranh đa dạng và thay đổi nhanh chóng của các công nghệ xử lý và lưu trữ dữ liệu. Cuốn sách này không phải là hướng dẫn cho một công cụ cụ thể, cũng không phải là sách giáo khoa đầy lý thuyết khô khan. Thay vào đó, chúng ta sẽ xem xét các ví dụ về hệ thống dữ liệu thành công: các công nghệ tạo nên nền tảng cho nhiều ứng dụng phổ biến và phải đáp ứng các yêu cầu về khả năng mở rộng, hiệu suất và độ tin cậy trong sản xuất mỗi ngày.

Chúng ta sẽ đào sâu vào nội bộ của những hệ thống đó, phân tích các thuật toán chính, thảo luận về các nguyên tắc và những đánh đổi mà chúng phải thực hiện. Trong hành trình này, chúng ta sẽ cố gắng tìm ra những cách hữu ích để suy nghĩ về các hệ thống dữ liệu - không chỉ cách chúng hoạt động, mà còn tại sao chúng hoạt động theo cách đó, và những câu hỏi nào chúng ta cần đặt ra.

Sau khi đọc cuốn sách này, bạn sẽ ở vị trí tốt để quyết định loại công nghệ nào phù hợp với mục đích nào, và hiểu cách các công cụ có thể được kết hợp để tạo thành nền tảng của một kiến trúc ứng dụng tốt. Bạn sẽ không sẵn sàng tự xây dựng storage engine cơ sở dữ liệu từ đầu, nhưng may mắn thay điều đó hiếm khi cần thiết. Tuy nhiên, bạn sẽ phát triển được trực giác tốt về những gì hệ thống đang làm bên dưới để bạn có thể lý luận về hành vi của chúng, đưa ra các quyết định thiết kế tốt và truy tìm bất kỳ vấn đề nào có thể phát sinh.

Ai Nên Đọc Cuốn Sách Này?

Nếu bạn phát triển các ứng dụng có một loại server/backend nào đó để lưu trữ hoặc xử lý dữ liệu, và ứng dụng của bạn sử dụng internet (ví dụ: ứng dụng web, ứng dụng di động, hoặc cảm biến kết nối internet), thì cuốn sách này dành cho bạn.

Cuốn sách này dành cho các kỹ sư phần mềm, kiến trúc sư phần mềm và các quản lý kỹ thuật yêu thích lập trình. Nó đặc biệt phù hợp nếu bạn cần đưa ra quyết định về kiến trúc của các hệ thống bạn đang làm việc - ví dụ, nếu bạn cần chọn các công cụ để giải quyết một vấn đề cụ thể và tìm ra cách áp dụng chúng tốt nhất. Nhưng ngay cả khi bạn không có lựa chọn về các công cụ, cuốn sách này sẽ giúp bạn hiểu rõ hơn về điểm mạnh và điểm yếu của chúng.

Bạn nên có một số kinh nghiệm xây dựng ứng dụng web hoặc dịch vụ mạng, và bạn nên quen thuộc với cơ sở dữ liệu quan hệ và SQL. Bất kỳ cơ sở dữ liệu phi quan hệ và các công cụ liên quan đến dữ liệu nào bạn biết đều là điểm cộng, nhưng không bắt buộc. Hiểu biết chung về các giao thức mạng phổ biến như TCP và HTTP rất hữu ích. Lựa chọn ngôn ngữ lập trình hay framework của bạn không quan trọng với cuốn sách này.

Nếu bất kỳ điều nào sau đây đúng với bạn, bạn sẽ thấy cuốn sách này có giá trị:

  • Bạn muốn học cách làm cho hệ thống dữ liệu có khả năng mở rộng, ví dụ để hỗ trợ ứng dụng web hoặc di động với hàng triệu người dùng.
  • Bạn cần làm cho ứng dụng có tính sẵn sàng cao (giảm thiểu thời gian ngừng hoạt động) và vận hành ổn định.
  • Bạn đang tìm cách làm cho hệ thống dễ bảo trì hơn về lâu dài, ngay cả khi chúng phát triển và khi yêu cầu và công nghệ thay đổi.
  • Bạn có sự tò mò tự nhiên về cách mọi thứ hoạt động và muốn biết những gì đang xảy ra bên trong các trang web và dịch vụ trực tuyến lớn. Cuốn sách này phân tích nội bộ của nhiều cơ sở dữ liệu và hệ thống xử lý dữ liệu, và thật thú vị khi khám phá những suy nghĩ sáng suốt đã được đưa vào thiết kế của chúng.

Đôi khi, khi thảo luận về các hệ thống dữ liệu có khả năng mở rộng, mọi người đưa ra những bình luận kiểu như “Bạn không phải Google hay Amazon. Thôi lo chuyện mở rộng đi, cứ dùng cơ sở dữ liệu quan hệ là được.” Câu đó có phần đúng: xây dựng cho quy mô mà bạn không cần là lãng phí công sức và có thể khóa bạn vào một thiết kế cứng nhắc. Thực chất, đó là một dạng tối ưu hóa sớm (premature optimization). Tuy nhiên, chọn đúng công cụ cho công việc cũng quan trọng, và mỗi công nghệ khác nhau đều có điểm mạnh và điểm yếu riêng. Như chúng ta sẽ thấy, cơ sở dữ liệu quan hệ quan trọng nhưng không phải tiếng nói cuối cùng trong việc xử lý dữ liệu.

Phạm Vi Của Cuốn Sách

Cuốn sách này không cố gắng đưa ra hướng dẫn chi tiết về cách cài đặt hoặc sử dụng các gói phần mềm hay API cụ thể, vì đã có đầy đủ tài liệu cho những thứ đó. Thay vào đó, chúng ta thảo luận về các nguyên tắc và đánh đổi khác nhau là nền tảng cho các hệ thống dữ liệu, và chúng ta khám phá các quyết định thiết kế khác nhau được thực hiện bởi các sản phẩm khác nhau.

Trong các ấn bản ebook, chúng tôi đã đưa vào các liên kết tới toàn văn của các tài liệu trực tuyến. Tất cả các liên kết đã được xác minh tại thời điểm xuất bản, nhưng tiếc thay các liên kết thường xuyên bị hỏng do bản chất của web. Nếu bạn gặp liên kết hỏng, hoặc nếu bạn đang đọc bản in của cuốn sách này, bạn có thể tra cứu các tài liệu tham khảo bằng công cụ tìm kiếm. Đối với các bài báo học thuật, bạn có thể tìm kiếm tiêu đề trên Google Scholar để tìm file PDF mở. Ngoài ra, bạn có thể tìm tất cả tài liệu tham khảo tại https://github.com/ept/ddia-references, nơi chúng tôi duy trì các liên kết cập nhật.

Chúng ta chủ yếu xem xét kiến trúc của các hệ thống dữ liệu và cách chúng được tích hợp vào các ứng dụng data-intensive. Cuốn sách này không có chỗ để đề cập đến triển khai, vận hành, bảo mật, quản lý và các lĩnh vực khác - đây là những chủ đề phức tạp và quan trọng, và chúng ta sẽ không làm chúng được tốt nếu chỉ nêu qua loa. Chúng xứng đáng có những cuốn sách riêng.

Nhiều công nghệ được mô tả trong cuốn sách này nằm trong phạm vi của thuật ngữ thời thượng Big Data. Tuy nhiên, thuật ngữ “Big Data” bị sử dụng quá nhiều và định nghĩa quá mờ nhạt đến mức không hữu ích trong một cuộc thảo luận kỹ thuật nghiêm túc. Cuốn sách này sử dụng các thuật ngữ ít mơ hồ hơn, chẳng hạn như hệ thống đơn nút so với hệ thống phân tán, hay hệ thống xử lý trực tuyến/tương tác so với xử lý ngoại tuyến/theo lô.

Cuốn sách này có xu hướng nghiêng về phần mềm miễn phí và nguồn mở (FOSS), vì đọc, sửa đổi và thực thi mã nguồn là cách tuyệt vời để hiểu chi tiết cách một thứ hoạt động. Các nền tảng mở cũng giảm rủi ro bị khóa vào nhà cung cấp (vendor lock-in). Tuy nhiên, khi phù hợp, chúng ta cũng thảo luận về phần mềm độc quyền (phần mềm đóng mã nguồn, phần mềm dưới dạng dịch vụ, hay phần mềm nội bộ của các công ty chỉ được mô tả trong tài liệu mà không được phát hành công khai).

Bố Cục Cuốn Sách

Cuốn sách này được sắp xếp thành ba phần:

  1. Trong Phần I, chúng ta thảo luận về các ý tưởng nền tảng làm cơ sở cho thiết kế các ứng dụng data-intensive. Chúng ta bắt đầu ở Chương 1 bằng cách thảo luận về những gì chúng ta thực sự đang cố gắng đạt được: độ tin cậy, khả năng mở rộng và khả năng bảo trì; cách chúng ta cần suy nghĩ về chúng; và cách chúng ta có thể đạt được chúng. Trong Chương 2 chúng ta so sánh một số mô hình dữ liệu và ngôn ngữ truy vấn khác nhau, và xem chúng phù hợp với các tình huống khác nhau như thế nào. Trong Chương 3 chúng ta nói về storage engine: cách cơ sở dữ liệu sắp xếp dữ liệu trên đĩa để chúng ta có thể tìm thấy lại một cách hiệu quả. Chương 4 chuyển sang các định dạng mã hóa dữ liệu (serialization) và sự tiến hóa của schema theo thời gian.

  2. Trong Phần II, chúng ta chuyển từ dữ liệu được lưu trữ trên một máy sang dữ liệu được phân tán trên nhiều máy. Điều này thường cần thiết cho khả năng mở rộng, nhưng mang lại nhiều thách thức độc đáo. Đầu tiên chúng ta thảo luận về replication (Chương 5), partitioning/sharding (Chương 6), và transaction (Chương 7). Sau đó chúng ta đi vào chi tiết hơn về các vấn đề với hệ thống phân tán (Chương 8) và ý nghĩa của việc đạt được tính nhất quán và đồng thuận trong hệ thống phân tán (Chương 9).

  3. Trong Phần III, chúng ta thảo luận về các hệ thống dẫn xuất một số dataset từ các dataset khác. Dữ liệu dẫn xuất thường xuất hiện trong các hệ thống không đồng nhất: khi không có một cơ sở dữ liệu nào có thể làm mọi thứ tốt, các ứng dụng cần tích hợp nhiều cơ sở dữ liệu, bộ nhớ cache, chỉ mục khác nhau, v.v. Trong Chương 10 chúng ta bắt đầu với cách tiếp cận xử lý theo lô (batch processing) cho dữ liệu dẫn xuất, và chúng ta xây dựng trên đó với xử lý luồng (stream processing) trong Chương 11. Cuối cùng, trong Chương 12 chúng ta tổng hợp mọi thứ lại và thảo luận về các cách tiếp cận để xây dựng các ứng dụng đáng tin cậy, có khả năng mở rộng và dễ bảo trì trong tương lai.

Tài Liệu Tham Khảo và Đọc Thêm

Hầu hết những gì chúng ta thảo luận trong cuốn sách này đã được đề cập ở nơi khác dưới một dạng nào đó - trong các buổi thuyết trình hội nghị, bài báo nghiên cứu, bài đăng blog, mã nguồn, trình theo dõi lỗi, danh sách gửi thư và truyền thống kỹ thuật. Cuốn sách này tóm tắt các ý tưởng quan trọng nhất từ nhiều nguồn khác nhau, và bao gồm các con trỏ tới tài liệu gốc xuyên suốt văn bản. Các tài liệu tham khảo ở cuối mỗi chương là nguồn tài nguyên tuyệt vời nếu bạn muốn khám phá sâu hơn một lĩnh vực, và hầu hết chúng đều có thể truy cập miễn phí trực tuyến.

O’Reilly Safari

Safari (trước đây là Safari Books Online) là nền tảng đào tạo và tham khảo dựa trên thành viên cho doanh nghiệp, chính phủ, nhà giáo dục và cá nhân.

Các thành viên có quyền truy cập vào hàng nghìn cuốn sách, video đào tạo, Learning Path, hướng dẫn tương tác và danh sách phát được tuyển chọn từ hơn 250 nhà xuất bản, bao gồm O’Reilly Media, Harvard Business Review, Prentice Hall Professional, Addison-Wesley Professional, Microsoft Press, Sams, Que, Peachpit Press, Adobe, Focal Press, Cisco Press, John Wiley & Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe Press, FT Press, Apress, Manning, New Riders, McGraw-Hill, Jones & Bartlett và Course Technology, cùng nhiều đơn vị khác.

Để biết thêm thông tin, vui lòng truy cập http://oreilly.com/safari.

Cách Liên Hệ Chúng Tôi

Vui lòng gửi nhận xét và câu hỏi liên quan đến cuốn sách này cho nhà xuất bản:

O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 800-998-9938 (tại Hoa Kỳ hoặc Canada) 707-829-0515 (quốc tế hoặc nội địa) 707-829-0104 (fax)

Chúng tôi có một trang web cho cuốn sách này, nơi chúng tôi liệt kê errata, ví dụ và bất kỳ thông tin bổ sung nào. Bạn có thể truy cập trang này tại http://bit.ly/designing-data-intensive-apps.

Để nhận xét hoặc đặt câu hỏi kỹ thuật về cuốn sách này, hãy gửi email tới [email protected].

Để biết thêm thông tin về sách, khóa học, hội nghị và tin tức, hãy xem trang web của chúng tôi tại http://www.oreilly.com.

Lời Cảm Ơn

Cuốn sách này là sự tổng hợp và hệ thống hóa ý tưởng và kiến thức của rất nhiều người khác, kết hợp kinh nghiệm từ cả nghiên cứu học thuật và thực hành công nghiệp. Trong điện toán, chúng ta có xu hướng bị thu hút bởi những thứ mới và bóng bẩy, nhưng tôi nghĩ chúng ta có rất nhiều điều để học từ những thứ đã được làm trước đây. Cuốn sách này có hơn 800 tài liệu tham khảo đến các bài báo, bài đăng blog, bài thuyết trình, tài liệu và hơn thế nữa, và chúng là nguồn học hỏi vô giá với tôi. Tôi rất biết ơn các tác giả của những tài liệu này vì đã chia sẻ kiến thức của họ.

Tôi cũng đã học được rất nhiều từ các cuộc trò chuyện trực tiếp, nhờ vào số lượng lớn những người đã dành thời gian thảo luận ý tưởng hoặc kiên nhẫn giải thích mọi thứ cho tôi. Đặc biệt, tôi muốn cảm ơn Joe Adler, Ross Anderson, Peter Bailis, Márton Balassi, Alastair Beresford, Mark Callaghan, Mat Clayton, Patrick Collison, Sean Cribbs, Shirshanka Das, Niklas Ekström, Stephan Ewen, Alan Fekete, Gyula Fóra, Camille Fournier, Andres Freund, John Garbutt, Seth Gilbert, Tom Haggett, Pat Helland, Joe Hellerstein, Jakob Homan, Heidi Howard, John Hugg, Julian Hyde, Conrad Irwin, Evan Jones, Flavio Junqueira, Jessica Kerr, Kyle Kingsbury, Jay Kreps, Carl Lerche, Nicolas Liochon, Steve Loughran, Lee Mallabone, Nathan Marz, Caitie McCaffrey, Josie McLellan, Christopher Meiklejohn, Ian Meyers, Neha Narkhede, Neha Narula, Cathy O’Neil, Onora O’Neill, Ludovic Orban, Zoran Perkov, Julia Powles, Chris Riccomini, Henry Robinson, David Rosenthal, Jennifer Rullmann, Matthew Sackman, Martin Scholl, Amit Sela, Gwen Shapira, Greg Spurrier, Sam Stokes, Ben Stopford, Tom Stuart, Diana Vasile, Rahul Vohra, Pete Warden và Brett Wooldridge.

Nhiều người nữa đã vô cùng quý giá cho việc viết cuốn sách này bằng cách xem xét các bản thảo và đưa ra phản hồi. Về những đóng góp này, tôi đặc biệt biết ơn Raul Agepati, Tyler Akidau, Mattias Andersson, Sasha Baranov, Veena Basavaraj, David Beyer, Jim Brikman, Paul Carey, Raul Castro Fernandez, Joseph Chow, Derek Elkins, Sam Elliott, Alexander Gallego, Mark Grover, Stu Halloway, Heidi Howard, Nicola Kleppmann, Stefan Kruppa, Bjorn Madsen, Sander Mak, Stefan Podkowinski, Phil Potter, Hamid Ramazani, Sam Stokes và Ben Summers. Dĩ nhiên, tôi chịu hoàn toàn trách nhiệm cho bất kỳ lỗi còn sót lại hay ý kiến không dễ nuốt nào trong cuốn sách này.

Để giúp cuốn sách này trở thành hiện thực, và vì sự kiên nhẫn với việc viết chậm và những yêu cầu bất thường của tôi, tôi biết ơn các biên tập viên Marie Beaugureau, Mike Loukides, Ann Spencer và toàn bộ nhóm tại O’Reilly. Để tìm ra những từ ngữ phù hợp, tôi cảm ơn Rachel Head. Để cho tôi thời gian và sự tự do để viết bất chấp các cam kết công việc khác, tôi cảm ơn Alastair Beresford, Susan Goodhue, Neha Narkhede và Kevin Scott.

Lời cảm ơn đặc biệt dành cho Shabbir Diwan và Edie Freedman, những người đã minh họa rất cẩn thận các bản đồ đi kèm các chương. Thật tuyệt vời khi họ đã đảm nhận ý tưởng phi thường về việc tạo ra các bản đồ, và đã làm chúng đẹp và hấp dẫn đến vậy.

Cuối cùng, tình yêu của tôi gửi đến gia đình và bạn bè, những người mà nếu không có họ tôi đã không thể vượt qua quá trình viết lách gần bốn năm này. Các bạn thật tuyệt vời.