Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Giới thiệu

Tình cờ là tại nơi làm việc hiện tại của tôi, tôi phải làm quen với công nghệ này. Tôi sẽ bắt đầu với một chút thông tin cơ bản. Tại cuộc họp tiếp theo, nhóm của chúng tôi được thông báo rằng chúng tôi cần tạo ra sự tích hợp với hệ thống đã biết. Bằng cách tích hợp, điều đó có nghĩa là hệ thống nổi tiếng này sẽ gửi cho chúng tôi các yêu cầu qua HTTP đến một điểm cuối cụ thể và kỳ lạ thay, chúng tôi sẽ gửi lại phản hồi dưới dạng thông báo SOAP. Mọi thứ có vẻ đơn giản và tầm thường. Từ đó suy ra rằng bạn cần...

Nhiệm vụ

Tạo 3 dịch vụ. Đầu tiên trong số đó là Dịch vụ cập nhật cơ sở dữ liệu. Dịch vụ này, khi có dữ liệu mới đến từ hệ thống của bên thứ ba, sẽ cập nhật dữ liệu trong cơ sở dữ liệu và tạo tệp ở định dạng CSV để chuyển dữ liệu đó sang hệ thống tiếp theo. Điểm cuối của dịch vụ thứ hai được gọi - Dịch vụ vận chuyển FTP, nhận tệp được truyền, xác thực nó và đưa nó vào bộ lưu trữ tệp qua FTP. Dịch vụ thứ ba, dịch vụ truyền dữ liệu dành cho người tiêu dùng, hoạt động không đồng bộ với hai dịch vụ đầu tiên. Nó nhận được yêu cầu từ hệ thống bên ngoài của bên thứ ba để nhận tệp được thảo luận ở trên, lấy tệp phản hồi sẵn sàng, sửa đổi nó (cập nhật các trường id, mô tả, linkToFile) và gửi phản hồi dưới dạng tin nhắn SOAP. Tức là, bức tranh tổng thể như sau: hai dịch vụ đầu tiên chỉ bắt đầu hoạt động khi có dữ liệu để cập nhật. Dịch vụ thứ ba hoạt động liên tục vì có nhiều người sử dụng thông tin, khoảng 1000 yêu cầu dữ liệu mỗi phút. Các dịch vụ luôn sẵn có và các phiên bản của chúng được đặt trong các môi trường khác nhau, chẳng hạn như thử nghiệm, demo, tiền sản xuất và sản xuất. Dưới đây là sơ đồ về cách các dịch vụ này hoạt động. Hãy để tôi làm rõ ngay rằng một số chi tiết đã được đơn giản hóa để tránh sự phức tạp không cần thiết.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Đào sâu kỹ thuật

Khi lập kế hoạch giải pháp cho vấn đề này, trước tiên chúng tôi quyết định tạo các ứng dụng bằng Java bằng cách sử dụng khung Spring, bộ cân bằng Nginx, cơ sở dữ liệu Postgres và những thứ kỹ thuật khác chứ không phải kỹ thuật quá. Vì thời điểm phát triển giải pháp kỹ thuật cho phép chúng tôi xem xét các cách tiếp cận khác để giải quyết vấn đề này, chúng tôi đã chú ý đến công nghệ Apache NIFI, một công nghệ đang thịnh hành trong một số vòng tròn nhất định. Tôi sẽ nói ngay rằng công nghệ này cho phép chúng tôi chú ý đến 3 dịch vụ này. Bài viết này sẽ mô tả sự phát triển của dịch vụ vận chuyển tệp và dịch vụ truyền dữ liệu đến người tiêu dùng, nhưng nếu bài viết hữu ích, tôi sẽ viết về dịch vụ cập nhật dữ liệu trong cơ sở dữ liệu.

Đây là gì

NIFI là một kiến ​​trúc phân tán để tải và xử lý dữ liệu song song nhanh chóng, một số lượng lớn các plugin cho nguồn và chuyển đổi, tạo phiên bản cấu hình và hơn thế nữa. Một phần thưởng tuyệt vời là nó rất dễ sử dụng. Các quy trình tầm thường như getFile, sendHttpRequest và các quy trình khác có thể được biểu diễn dưới dạng hình vuông. Mỗi ô vuông đại diện cho một quá trình, sự tương tác của chúng có thể được nhìn thấy trong hình bên dưới. Tài liệu chi tiết hơn về các tương tác thiết lập quy trình đã được viết đây , dành cho những người nói tiếng Nga - đây. Tài liệu mô tả hoàn hảo cách giải nén và chạy NIFI, cũng như cách tạo các quy trình, còn được gọi là hình vuông
Ý tưởng viết một bài báo ra đời sau một thời gian dài tìm kiếm và cấu trúc thông tin nhận được thành một thứ gì đó có ý thức, cũng như mong muốn làm cho cuộc sống của các nhà phát triển tương lai dễ dàng hơn một chút..

Ví dụ

Một ví dụ về cách các hình vuông tương tác với nhau được xem xét. Sơ đồ chung khá đơn giản: Chúng tôi nhận được một yêu cầu HTTP (Về lý thuyết, với một tệp trong phần nội dung của yêu cầu. Để chứng minh khả năng của NIFI, trong ví dụ này, yêu cầu bắt đầu quá trình nhận tệp từ bộ lưu trữ tệp cục bộ ), sau đó chúng tôi gửi lại phản hồi rằng yêu cầu đã được nhận, song song với quá trình nhận file từ FH và sau đó là quá trình chuyển file qua FTP sang FH. Cần làm rõ rằng các tiến trình tương tác với nhau thông qua cái gọi là flowFile. Đây là thực thể cơ sở trong NIFI lưu trữ các thuộc tính và nội dung. Nội dung là dữ liệu được biểu thị bằng tệp luồng. Nói một cách đại khái, nếu bạn nhận một tệp từ ô này và chuyển nó sang ô khác thì nội dung sẽ là tệp của bạn.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Như bạn có thể thấy, hình ảnh này cho thấy quá trình chung. HandleHttpRequest - chấp nhận yêu cầu, ReplyText - tạo nội dung phản hồi, HandleHttpResponse - gửi phản hồi. FetchFile - nhận tệp từ bộ lưu trữ tệp, chuyển tệp đó sang PutSftp vuông - đặt tệp này trên FTP, tại địa chỉ được chỉ định. Bây giờ thêm về quá trình này.

Trong trường hợp này, yêu cầu là sự khởi đầu của mọi thứ. Hãy nhìn vào thông số cấu hình của nó.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Mọi thứ ở đây khá tầm thường ngoại trừ StandardHttpContextMap - đây là một loại dịch vụ cho phép bạn gửi và nhận yêu cầu. Chi tiết hơn và thậm chí với các ví dụ, bạn có thể thấy - đây

Tiếp theo, chúng ta hãy xem các thông số cấu hình Thay thế của hình vuông. Điều đáng chú ý là Giá trị thay thế - đây là giá trị sẽ được trả lại cho người dùng dưới dạng phản hồi. Trong cài đặt, bạn có thể điều chỉnh mức độ ghi nhật ký, bạn có thể xem nhật ký {nơi bạn đã giải nén nifi}/nifi-1.9.2/log, cũng có các tham số lỗi/thành công - dựa trên các tham số này, bạn có thể điều chỉnh toàn bộ quy trình . Nghĩa là, trong trường hợp xử lý văn bản thành công, quá trình gửi phản hồi cho người dùng sẽ được gọi và trong trường hợp khác, chúng tôi sẽ chỉ ghi lại quá trình không thành công.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Không có gì đặc biệt thú vị trong thuộc tính HandleHttpResponse ngoại trừ trạng thái khi phản hồi được tạo thành công.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Chúng tôi đã sắp xếp yêu cầu và phản hồi - hãy chuyển sang nhận tệp và đặt nó trên máy chủ FTP. FetchFile - nhận tệp tại đường dẫn được chỉ định trong cài đặt và chuyển tệp đó sang quy trình tiếp theo.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Và sau đó là hình vuông PutSftp - đặt tệp vào bộ lưu trữ tệp. Chúng ta có thể xem thông số cấu hình bên dưới.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Điều đáng chú ý là mỗi ô vuông là một quá trình riêng biệt phải được khởi chạy. Chúng tôi đã xem xét ví dụ đơn giản nhất không yêu cầu bất kỳ tùy chỉnh phức tạp nào. Tiếp theo, chúng ta sẽ xem xét quy trình phức tạp hơn một chút, trong đó chúng ta sẽ viết một chút lên các rãnh.

Ví dụ phức tạp hơn

Dịch vụ truyền dữ liệu đến người tiêu dùng hóa ra phức tạp hơn một chút do quá trình sửa đổi thông báo SOAP. Quá trình chung được thể hiện trong hình dưới đây.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Ở đây, ý tưởng cũng không đặc biệt phức tạp: chúng tôi nhận được yêu cầu từ người tiêu dùng rằng anh ta cần dữ liệu, gửi phản hồi rằng anh ta đã nhận được tin nhắn, bắt đầu quá trình nhận tệp phản hồi, sau đó chỉnh sửa nó theo một logic nhất định và sau đó đã chuyển tệp đến người tiêu dùng dưới dạng thông báo SOAP đến máy chủ.

Tôi nghĩ không cần thiết phải mô tả lại những hình vuông mà chúng ta đã thấy ở trên - hãy chuyển thẳng sang những hình vuông mới. Nếu bạn cần chỉnh sửa bất kỳ tệp nào và các ô vuông loại Thay thế thông thường không phù hợp, bạn sẽ phải viết tập lệnh của riêng mình. Điều này có thể được thực hiện bằng cách sử dụng ô vuông Thực thiGroogyScript. Cài đặt của nó được trình bày dưới đây.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Có hai tùy chọn để tải tập lệnh vào ô vuông này. Đầu tiên là tải xuống một tập tin có tập lệnh. Cách thứ hai là chèn tập lệnh vào scriptBody. Theo những gì tôi biết, ô vuông execScript hỗ trợ một số ngôn ngữ - một trong số đó là ngôn ngữ hấp dẫn. Tôi sẽ làm các nhà phát triển java thất vọng - bạn không thể viết tập lệnh bằng java theo những ô vuông như vậy. Đối với những người thực sự muốn, bạn cần tạo hình vuông tùy chỉnh của riêng mình và thêm nó vào hệ thống NIFI. Toàn bộ hoạt động này đi kèm với một điệu nhảy khá dài với tambourine, mà chúng tôi sẽ không đề cập đến trong bài viết này. Tôi đã chọn ngôn ngữ hấp dẫn. Dưới đây là tập lệnh thử nghiệm chỉ cập nhật dần dần id trong thông báo SOAP. Điều quan trọng cần lưu ý. Bạn lấy file từ flowFile và cập nhật nó, đừng quên rằng bạn cần đặt lại đó, đã cập nhật. Điều đáng lưu ý là không phải tất cả các thư viện đều được bao gồm. Có thể xảy ra trường hợp bạn vẫn phải nhập một trong các lib. Một nhược điểm khác là tập lệnh trong ô vuông này khá khó gỡ lỗi. Có một cách để kết nối với NIFI JVM và bắt đầu quá trình gỡ lỗi. Cá nhân tôi đã khởi chạy một ứng dụng cục bộ và mô phỏng việc nhận tệp từ phiên. Tôi cũng đã gỡ lỗi cục bộ. Các lỗi xuất hiện khi tải tập lệnh khá dễ xảy ra với Google và được chính NIFI ghi vào nhật ký.

import org.apache.commons.io.IOUtils
import groovy.xml.XmlUtil
import java.nio.charset.*
import groovy.xml.StreamingMarkupBuilder

def flowFile = session.get()
if (!flowFile) return
try {
    flowFile = session.write(flowFile, { inputStream, outputStream ->
        String result = IOUtils.toString(inputStream, "UTF-8");
        def recordIn = new XmlSlurper().parseText(result)
        def element = recordIn.depthFirst().find {
            it.name() == 'id'
        }

        def newId = Integer.parseInt(element.toString()) + 1
        def recordOut = new XmlSlurper().parseText(result)
        recordOut.Body.ClientMessage.RequestMessage.RequestContent.content.MessagePrimaryContent.ResponseBody.id = newId

        def res = new StreamingMarkupBuilder().bind { mkp.yield recordOut }.toString()
        outputStream.write(res.getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
     session.transfer(flowFile, REL_SUCCESS)
}
catch(Exception e) {
    log.error("Error during processing of validate.groovy", e)
    session.transfer(flowFile, REL_FAILURE)
}

Trên thực tế, đây là lúc việc tùy chỉnh hình vuông kết thúc. Tiếp theo, tệp cập nhật được chuyển đến hình vuông, có nhiệm vụ gửi tệp đến máy chủ. Dưới đây là các cài đặt cho hình vuông này.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Chúng tôi mô tả phương pháp mà thông báo SOAP sẽ được truyền đi. Chúng tôi viết ở đâu. Tiếp theo bạn cần chỉ ra rằng đây là SOAP.

Apache NIFI - Tổng quan ngắn gọn về các cơ hội trong thực tế

Thêm một số thuộc tính như máy chủ và hành động (soapAction). Chúng tôi lưu và kiểm tra. Bạn có thể xem thêm chi tiết về cách gửi yêu cầu SOAP đây

Chúng tôi đã xem xét một số tùy chọn để sử dụng quy trình NIFI. Họ tương tác như thế nào và lợi ích thực sự của họ là gì? Các ví dụ được xem xét là ví dụ thử nghiệm và hơi khác so với những gì thực sự xảy ra trong chiến đấu. Tôi hy vọng bài viết này sẽ hữu ích một chút cho các nhà phát triển. Cám ơn vì sự quan tâm của bạn. Nếu bạn có bất kỳ câu hỏi nào, hãy viết. Tôi sẽ cố gắng trả lời.

Nguồn: www.habr.com

Thêm một lời nhận xét