Làm thế nào bạn có thể sử dụng hiệu quả các dịch vụ web trong môi trường doanh nghiệp nếu bạn không thể sử dụng các giao dịch?


14

Nơi tôi đang làm việc đang cố gắng thiết lập một số quy tắc cơ bản và cuộc tranh luận mà chúng ta hiện đang có là các thư viện địa phương và các dịch vụ web để sử dụng lại mã. Các dịch vụ web dường như là lựa chọn phổ biến ở hầu hết các công ty và đó là điều mà hầu hết các nhà phát triển ở đây đang nghiêng về.

Tôi chỉ không thể thấy cách bạn có thể sử dụng hiệu quả các dịch vụ web cho bất kỳ công việc nghiêm túc nào. Làm cách nào tôi có thể thực hiện an toàn nhiều cuộc gọi dịch vụ nếu tôi không thể sử dụng giao dịch?

Giả sử tôi có một công việc định kỳ thu hút khách hàng từ cơ sở dữ liệu của chúng tôi đáp ứng một điều kiện nhất định mà họ cần được thông báo. Họ được gửi fax, email và một vé được tạo ra để theo dõi vấn đề trong nội bộ. Đó là 3 cuộc gọi dịch vụ khác nhau sẽ xảy ra cho mỗi khách hàng trong một vòng lặp for.

Nếu xảy ra lỗi ở bất cứ đâu trong đó, có thể, ví dụ, fax và email được gửi cho khách hàng, nhưng vé không được tạo. Hoặc tệ hơn, công việc định kỳ này có thể chứa một lỗi khiến nó bị lỗi tại cùng một thời điểm và nó liên tục gửi email cho cùng một khách hàng. Nếu các thư viện đều là địa phương, mọi thứ chỉ có thể được gói gọn trong một giao dịch, và không điều gì sẽ xảy ra. Nhưng chúng tôi đang sử dụng các dịch vụ web trong ví dụ này.

Lưu ý rằng các phương thức email và fax thực sự chèn dữ liệu vào các bảng xếp hàng dựa trên cơ sở dữ liệu, lần lượt được xử lý bởi một quy trình công việc định kỳ riêng biệt. Vì vậy, các cuộc gọi đến phương thức dịch vụ "gửi email" và "gửi fax" có thể bị hủy bỏ hiệu ứng phụ miễn phí nếu cần.

Một tùy chọn là đặt toàn bộ đoạn mã này vào chính dịch vụ web, vì vậy chính dịch vụ web sẽ gọi các phương thức tạo email, fax và vé trong một giao dịch. Nhưng sau đó, chúng tôi đang tạo ra một phương thức dịch vụ web chỉ để sử dụng giao dịch; không có lý do chính đáng nào chúng ta thực sự cần phải gọi phương thức này từ bất cứ đâu ngoại trừ tập lệnh cron này.

Làm thế nào bạn thường xử lý phương pháp này?


Để cung cấp câu trả lời đầy đủ, tôi cần thêm thông tin. Có rất nhiều điều cần xem xét khi chuyển sang kiến ​​trúc dựa trên dịch vụ. Ví dụ: bạn có môi trường không đồng nhất (ngôn ngữ và nền tảng khác nhau) hoặc môi trường đồng nhất (ngôn ngữ đơn và nền tảng). Bạn có một hệ thống xe buýt dịch vụ tại chỗ? Nếu không bạn có kế hoạch để thực hiện một? Làm thế nào để bạn có kế hoạch truy cập các dịch vụ của mình (Intranet một vị trí, wan đa vị trí, khách hàng phân tán đánh vào api dịch vụ công cộng). Có một số biến số ảnh hưởng đến một giải pháp "tối ưu".
Michael Brown

@MikeBrown: Tất cả các dịch vụ sẽ được viết bằng một ngôn ngữ, nhưng được sử dụng bởi nhiều nền tảng. Không có ý tưởng về việc triển khai EBS, chúng tôi thậm chí chưa bắt đầu bất kỳ loại dịch vụ nào hoạt động, vì vậy mọi thứ đều có thể. Các dịch vụ sẽ chủ yếu được tiêu thụ nội bộ qua mạng cục bộ của chúng tôi, nhưng sẽ có một số dịch vụ cần phải đối mặt công khai cho các ứng dụng di động.
ryeguy

"Nếu các thư viện đều là địa phương, mọi thứ chỉ có thể được gói gọn trong một giao dịch, và không có điều gì sẽ xảy ra". Sai. Lỗi có thể xảy ra sau khi email được gửi nhưng trước khi cập nhật cơ sở dữ liệu cuối cùng. Một giao dịch không ngăn chặn hồi tố email hoặc fax.
S.Lott

@ S.Lott: Điều đó sẽ xảy ra, bởi vì các cuộc gọi dịch vụ email và fax thực sự chỉ là chèn chúng vào hàng đợi, được phân phối theo một quy trình khác. Nếu giao dịch tôi mô tả ở trên xảy ra, việc chèn hàng đợi sẽ bị hủy bỏ.
ryeguy

1
@ryeguy: Vui lòng cập nhật câu hỏi. Xin đừng thêm ý kiến ​​cho câu hỏi. Đây là một phần quan trọng trong kiến ​​trúc của bạn. Hãy tiết lộ nó trong câu hỏi.
S.Lott

Câu trả lời:


5

Những gì bạn đang mô tả trên thực tế là một giao dịch phân tán thực hiện cam kết hai pha . Một số nền tảng nhắn tin doanh nghiệp bao gồm các nhà quản lý giao dịch để hỗ trợ loại điều đó, nhưng các sản phẩm cụ thể phụ thuộc vào nền tảng / ngôn ngữ. Tôi không có kinh nghiệm cụ thể với các công cụ như vậy, nhưng hy vọng những gợi ý này có ích.


3

Thật thú vị khi tôi tham gia vào Hỏi & Đáp cụ thể này, có một chủ đề tương tự về các dịch vụ hỗ trợ nhiều nền tảng trong danh sách gửi thư DDD / CQRS mà tôi đang tham gia. Tôi có thể nhắc lại một số lời khuyên của mình ở đây.

Một tùy chọn để hỗ trợ các giao dịch trong môi trường không đồng nhất là sử dụng cơ chế vận chuyển hỗ trợ các giao dịch và được hỗ trợ trên tất cả các nền tảng mà nó sẽ được sử dụng. Các chi tiết Message Queue Nghị định thư (AMQP) thực hiện giao dịch hỗ trợ và có một API bản địa cho hầu hết các ngôn ngữ đó là thường được sử dụng ngày hôm nay. RabbitMQ là một máy chủ thực hiện AMQP và đã được xem xét kỹ lưỡng trong ngành như một giải pháp mạnh mẽ.

Tận dụng hệ thống dựa trên RabbitMQ đưa bạn vào con đường có ESB đầy đủ nếu bạn cần phát triển nó. Bạn xuất bản tin nhắn lên một kênh và đăng ký vào hàng đợi. Điều mà thực sự mạnh mẽ là giữa kênh và hàng đợi, bạn có thể thực hiện rất nhiều điều thú vị. Một kênh có thể cung cấp nhiều hàng đợi (pub / sub) một hàng đợi có thể được cung cấp bởi nhiều kênh, bạn có thể định tuyến tin nhắn đến các hàng đợi khác nhau dựa trên nội dung, v.v.

Tôi chỉ đọc về các lựa chọn thay thế cho các giao dịch (đi kèm với chi phí hoạt động và biến một hoạt động không đồng bộ thành một op chặn). RabbitMQ hỗ trợ những gì được gọi là nhà xuất bản xác nhận . Về cơ bản, nó cho phép bạn đăng ký một cuộc gọi lại cho một phương thức được xuất bản để xử lý một giao dịch thất bại. Trong trường hợp của bạn, nó có thể hoàn tác các yêu cầu email / fax và xóa vé.

Tất nhiên lỗ thỏ (tha thứ cho trò chơi chữ) thậm chí còn đi sâu hơn từ đó. Bạn có thể sử dụng Rabbit để thực hiện các hoạt động phối hợp phức tạp với cả dịch vụ web bên trong và bên ngoài.

Đối với dịch vụ web đối mặt công khai của bạn, nó trở nên đơn giản. Dịch vụ của bạn (có thể là SOAP, REST hoặc JSON) chỉ xuất bản một thông báo đến hàng đợi dịch vụ phù hợp và để hệ thống nội bộ của bạn xử lý nó từ đó.

Ngoài ra còn có chức năng tạo thông báo yêu cầu / phản hồi cho những tình huống mà bạn mong đợi thông tin nhanh chóng trở lại.


2

Các từ khóa bạn đang tìm kiếm là 'vũ đạo dịch vụ web'.

Kiểm tra bài viết của Wikipedia về nó.


Đôi khi được gọi là "dàn nhạc", cũng có.
S.Lott

1

Cách tôi xử lý việc này trong một ứng dụng dịch vụ tôi đã viết là tạo một trình bao bọc để xử lý các giao dịch cần thiết. Trong trường hợp của tôi, yêu cầu người dùng, được tạo bởi trang web, ứng dụng máy tính để bàn hoặc dịch vụ Windows, phải truy vấn một dịch vụ web và, dựa trên kết quả và các tùy chọn của người dùng, nó phải cập nhật DB cục bộ và, tùy chọn, một điều khiển từ xa thông qua một dịch vụ web. Sau đó, nó phải tạo một báo cáo để được trả lại ngay lập tức, gửi qua email và / hoặc fax. Tôi đã kiểm soát DB, email và tạo báo cáo cục bộ nhưng không có trên các dịch vụ web hoặc máy chủ fax.

Tạo một trình bao bọc cho phép kiểm soát giao dịch và xử lý lỗi tốt hơn. Nó cũng cho phép bảo mật tốt hơn bằng cách kiểm soát truy cập vào các dịch vụ mạng nội bộ từ các nguồn bên ngoài. Nói chung, tôi thấy nhu cầu giao dịch và quản lý dịch vụ là một lý do hợp lệ để tạo ra một trình bao bọc phù hợp cho một giải pháp duy nhất miễn là mã được sử dụng lại đúng cách (không mã hóa cắt dán).


1

Tôi chỉ không thể thấy cách bạn có thể sử dụng hiệu quả các dịch vụ web cho bất kỳ công việc nghiêm túc nào. Làm cách nào tôi có thể thực hiện an toàn nhiều cuộc gọi dịch vụ nếu tôi không thể sử dụng giao dịch?

Bạn không thể.

Câu hỏi bạn nên đặt ra là: làm cách nào để triển khai các giao dịch với khung dịch vụ web X? Ngay bây giờ, bạn chỉ cho rằng điều đó là không thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.