MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Truyền dữ liệu theo thời gian thực với Luồng thay đổi MongoDB

Gần đây, MongoDB đã phát hành một tính năng mới bắt đầu từ phiên bản 3.6, Change Streams. Điều này cung cấp cho bạn quyền truy cập tức thời vào dữ liệu của mình, giúp bạn luôn cập nhật các thay đổi dữ liệu của mình. Trong thế giới ngày nay, mọi người đều muốn nhận được thông báo tức thì hơn là nhận được sau vài giờ hoặc vài phút. Đối với một số ứng dụng, điều quan trọng là phải thông báo thời gian thực cho tất cả người dùng đã đăng ký đối với mỗi và mọi bản cập nhật. MongoDB đã làm cho quá trình này thực sự dễ dàng bằng cách giới thiệu tính năng này. Trong bài viết này, chúng ta sẽ tìm hiểu về luồng thay đổi MongoDB và các ứng dụng của nó với một số ví dụ.

Xác định Luồng thay đổi

Luồng thay đổi không là gì khác ngoài luồng thời gian thực của bất kỳ thay đổi nào xảy ra trong cơ sở dữ liệu hoặc bộ sưu tập hoặc thậm chí trong triển khai. Ví dụ:bất cứ khi nào bất kỳ cập nhật nào (Chèn, Cập nhật hoặc Xóa) xảy ra trong một bộ sưu tập cụ thể, MongoDB sẽ kích hoạt một sự kiện thay đổi với tất cả dữ liệu đã được sửa đổi.

Bạn có thể xác định các luồng thay đổi trên bất kỳ tập hợp nào giống như bất kỳ toán tử tổng hợp thông thường nào khác bằng cách sử dụng toán tử $ changeStream và phương thức watch (). Bạn cũng có thể xác định luồng thay đổi bằng phương thức MongoCollection.watch ().

Ví dụ

db.myCollection.watch()

Thay đổi các tính năng của luồng

  • Lọc các thay đổi

    Bạn có thể lọc các thay đổi để nhận thông báo sự kiện chỉ cho một số dữ liệu được nhắm mục tiêu.

    Ví dụ:

    pipeline = [
       {
         $match: { name: "Bob" }
       } ];
    changeStream = collection.watch(pipeline);

    Mã này sẽ đảm bảo rằng bạn chỉ nhận được các bản cập nhật cho các bản ghi có tên bằng Bob. Bằng cách này, bạn có thể viết bất kỳ đường ống nào để lọc các luồng thay đổi.

  • Tiếp tục Luồng thay đổi

    Tính năng này đảm bảo rằng không có mất mát dữ liệu trong bất kỳ trường hợp hỏng hóc nào. Mỗi phản hồi trong luồng chứa mã thông báo tiếp tục có thể được sử dụng để khởi động lại luồng từ một điểm cụ thể. Đối với một số lỗi mạng thường xuyên, trình điều khiển mongodb sẽ cố gắng thiết lập lại kết nối với người đăng ký bằng cách sử dụng mã thông báo tiếp tục gần đây nhất. Mặc dù, trong trường hợp ứng dụng bị lỗi hoàn toàn, khách hàng nên duy trì mã thông báo tiếp tục để tiếp tục luồng.

  • Luồng thay đổi có thứ tự

    MongoDB sử dụng đồng hồ lôgic toàn cục để sắp xếp tất cả các sự kiện luồng thay đổi trên tất cả các bản sao và phân đoạn của bất kỳ cụm nào, do đó, người nhận sẽ luôn nhận được thông báo theo đúng thứ tự các lệnh đã được áp dụng trên cơ sở dữ liệu.

  • Sự kiện với đầy đủ tài liệu

    MongoDB trả về một phần của các tài liệu phù hợp theo mặc định. Tuy nhiên, bạn có thể sửa đổi cấu hình luồng thay đổi để nhận được tài liệu đầy đủ. Để làm như vậy, hãy chuyển {fullDocument:“updateLookup”} đến phương thức xem.
    Ví dụ:

    collection = db.collection("myColl")
    changeStream = collection.watch({ fullDocument: “updateLookup”})
  • Độ bền

    Các luồng thay đổi sẽ chỉ thông báo cho dữ liệu được cam kết với phần lớn các bản sao. Điều này sẽ đảm bảo rằng các sự kiện được tạo ra bởi phần lớn dữ liệu liên tục đảm bảo độ bền của thư.

  • Bảo mật / Kiểm soát truy cập

    Các luồng thay đổi rất an toàn. Người dùng chỉ có thể tạo luồng thay đổi trên các bộ sưu tập mà họ có quyền đọc. Bạn có thể tạo luồng thay đổi dựa trên vai trò của người dùng.

Vài người trở thành MongoDB DBA - Đưa MongoDB vào Sản xuất Tìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng MongoDBDownload miễn phí

Ví dụ về Luồng thay đổi

Trong ví dụ này, chúng tôi sẽ tạo các luồng thay đổi trên bộ sưu tập Cổ phiếu để nhận thông báo khi bất kỳ giá cổ phiếu nào vượt qua bất kỳ ngưỡng nào.

  • Thiết lập cụm

    Để sử dụng các luồng thay đổi, trước tiên chúng ta phải tạo tập hợp bản sao. Chạy lệnh sau để tạo tập hợp bản sao nút đơn.

    mongod --dbpath ./data --replSet “rs”
  • Chèn một số bản ghi vào bộ sưu tập Cổ phiếu

    var docs = [
     { ticker: "AAPL", price: 210 },
     { ticker: "AAPL", price: 260 },
     { ticker: "AAPL", price: 245 },
     { ticker: "AAPL", price: 255 },
     { ticker: "AAPL", price: 270 }
    ];
    db.Stocks.insert(docs)
  • Thiết lập môi trường nút và cài đặt phần phụ thuộc

    mkdir mongo-proj && cd mongo-proj
    npm init -y
    npm install mongodb --save
  • Đăng ký để biết các thay đổi

    Tạo một tệp index.js và đặt mã sau vào đó.

    const mongo = require("mongodb").MongoClient;
    mongo.connect("mongodb://localhost:27017/?replicaSet=rs0").then(client => {
     console.log("Connected to MongoDB server");
     // Select DB and Collection
     const db = client.db("mydb");
     const collection = db.collection("Stocks");
     pipeline = [
       {
         $match: { "fullDocument.price": { $gte: 250 } }
       }
     ];
     // Define change stream
     const changeStream = collection.watch(pipeline);
     // start listen to changes
     changeStream.on("change", function(event) {
       console.log(JSON.stringify(event));
     });
    });

    Bây giờ hãy chạy tệp này:

    node index.js
  • Chèn bản ghi mới vào db để nhận bản cập nhật

    db.Stocks.insert({ ticker: “AAPL”, price: 280 })

    Bây giờ hãy kiểm tra bảng điều khiển của bạn, bạn sẽ nhận được bản cập nhật từ MongoDB.
    Phản hồi ví dụ:

    {
    "_id":{
    "_data":"825C5D51F70000000129295A1004E83608EE8F1B4FBABDCEE73D5BF31FC946645F696400645C5D51F73ACA83479B48DE6E0004"},
    "operationType":"insert",
    "clusterTime":"6655565945622233089",
    "fullDocument":{
    "_id":"5c5d51f73aca83479b48de6e",
    "ticker":"AAPL",
    "Price":300
    },
    "ns":{"db":"mydb","coll":"Stocks"},
    "documentKey":{"_id":"5c5d51f73aca83479b48de6e"}
    }

Tại đây, bạn có thể thay đổi giá trị của tham số operationType bằng các thao tác sau để lắng nghe các loại thay đổi khác nhau trong tập hợp:

  • Chèn
  • Thay thế (Ngoại trừ Id duy nhất)
  • Cập nhật
  • Xóa
  • Không hợp lệ (Bất cứ khi nào Mongo trả về con trỏ không hợp lệ)

Các Phương thức Thay đổi Khác

Bạn có thể bắt đầu các luồng thay đổi đối với cơ sở dữ liệu và triển khai theo cách tương tự như đối với bộ sưu tập. Tính năng này đã được phát hành từ phiên bản MongoDB 4.0. Dưới đây là các lệnh để mở luồng thay đổi dựa trên cơ sở dữ liệu và triển khai.

Against DB: db.watch()
Against deployment: Mongo.watch()

Kết luận

MongoDB Change Streams đơn giản hóa việc tích hợp giữa giao diện người dùng và phụ trợ theo thời gian thực và liền mạch. Tính năng này có thể giúp bạn sử dụng MongoDB cho mô hình pubsub, do đó bạn không cần phải quản lý việc triển khai Kafka hoặc RabbitMQ nữa. Nếu ứng dụng của bạn yêu cầu thông tin thời gian thực thì bạn phải kiểm tra tính năng này của MongoDB. Tôi hy vọng bài đăng này sẽ giúp bạn bắt đầu với các luồng thay đổi trong MongoDB.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách loại trừ một số trường khỏi tài liệu

  2. Triển khai đánh giá đối tượng biểu thức truy vấn giống goMongoDB

  3. Mongoose find () RegExp cho trường kiểu Số

  4. Cách thay thế tài liệu hiện có khi nhập tệp vào MongoDB

  5. Mongoose cập nhật mà không cần gọi lại