Trường hợp sử dụng tốt cho Akka [đóng]


605

Tôi đã nghe nhiều lời ca ngợi về khung Akka (nền tảng dịch vụ Java / Scala), nhưng cho đến nay vẫn chưa thấy nhiều ví dụ thực tế về các trường hợp sử dụng sẽ tốt cho nó. Vì vậy, tôi sẽ quan tâm đến việc nghe về những thứ mà các nhà phát triển đã sử dụng nó thành công.

Chỉ có một giới hạn: vui lòng không bao gồm trường hợp viết máy chủ trò chuyện. (tại sao? vì điều này đã được sử dụng quá mức làm ví dụ cho rất nhiều điều tương tự)


10
Không phải dễ dàng hơn để bắt đầu với vấn đề và tìm giải pháp cho nó, hơn là có một giải pháp và tìm kiếm một vấn đề để áp dụng nó? Tôi đoán là thay vì sử dụng RMI, Akka và các diễn viên của nó trông dễ dàng hơn / đơn giản hơn để viết mã.
Kennet

67
Có, nếu tôi có vấn đề cụ thể để giải quyết. Tôi không tìm kiếm một "cái cớ để sử dụng Akka" bằng bất kỳ phương tiện nào, nhưng tôi quan tâm đến việc học thêm một chút. Điều này cũng có thể giúp giải quyết các vấn đề trong tương lai, nhưng chủ yếu là cho quá trình học tập đang diễn ra.
StaxMan

Có câu hỏi liên quan nhưng về việc áp dụng AKKA cho ứng dụng hiện có + một số trường hợp sử dụng: stackoverflow.com/questions/16595685/
mẹo

2
Akka là một giải pháp tốt hơn so với JMS hoặc hệ thống xếp hàng lộn xộn phân tán theo kiểu MQ. Đó là cách tốt nhất để hiểu nó cho chính tôi, người gần đây đã hỏi chính xác câu hỏi: "Tôi hiểu cách sử dụng nó và xem nơi tôi có thể sử dụng nó, nhưng tôi không thể thấy điều này sẽ mang lại lợi thế thực sự ở đâu". Các giả định thiết kế cốt lõi đằng sau Akka tốt hơn nhiều so với các giả định đằng sau JMS / MQ, đặc biệt liên quan đến cách ly quy trình, thiết kế không khóa và xử lý thử / thất bại. Thứ hai, API thanh lịch hơn nhiều so với các công cụ JMS / MQ.
dùng2684602

2
@ người dùng2684602 hmmh. Tôi thấy câu trả lời đó không công bằng, theo cách táo với cam. Các MQ là (về mặt logic) các khối xây dựng đơn giản ít hơn Akka rất nhiều và tôi sẽ không so sánh chúng với nhau. Nhưng tôi đoán nếu tôi đọc nó là "so với các hệ thống phân tán được xây dựng bằng JMS, bằng văn bản khai báo" thì nó sẽ có ý nghĩa hơn.
Staxman

Câu trả lời:


321

Tôi đã sử dụng nó cho đến nay trong hai dự án thực sự rất thành công. cả hai đều ở trong trường thông tin giao thông gần thời gian thực (giao thông như trong xe hơi trên đường cao tốc), được phân phối trên một số nút, tích hợp tin nhắn giữa một số bên, hệ thống phụ trợ đáng tin cậy. Tôi không được tự do cung cấp thông tin cụ thể về khách hàng, khi tôi nhận được OK, có lẽ nó có thể được thêm vào như một tài liệu tham khảo.

Akka đã thực sự bắt tay vào các dự án đó, mặc dù chúng tôi đã bắt đầu khi nó ở phiên bản 0.7. (chúng tôi đang sử dụng scala bằng cách này)

Một trong những lợi thế lớn là bạn có thể dễ dàng soạn thảo một hệ thống từ các diễn viên và tin nhắn mà hầu như không có sự kết hợp, nó có quy mô cực kỳ tốt mà không có sự phức tạp của việc xâu chuỗi bằng tay và bạn có được thông điệp không đồng bộ giữa các đối tượng gần như miễn phí.

Nó là rất tốt trong việc mô hình hóa bất kỳ loại xử lý tin nhắn không đồng bộ. Tôi thích viết bất kỳ loại hệ thống dịch vụ (web) nào theo phong cách này hơn bất kỳ phong cách nào khác. (Bạn đã bao giờ thử viết một dịch vụ web không đồng bộ (phía máy chủ) bằng JAX-WS chưa? Đó là rất nhiều hệ thống ống nước). Vì vậy, tôi muốn nói rằng bất kỳ hệ thống nào không muốn treo trên một trong các thành phần của nó bởi vì mọi thứ đều được gọi ngầm bằng các phương thức đồng bộ và một thành phần đó đang khóa trên một cái gì đó. Nó rất ổn định và giải pháp cho phép sự cố + giám sát cho sự thất bại thực sự hoạt động tốt. Mọi thứ đều dễ dàng để thiết lập chương trình và không khó để kiểm tra đơn vị.

Sau đó là các mô-đun bổ trợ tuyệt vời. Mô-đun Camel thực sự kết hợp tốt với Akka và cho phép phát triển dễ dàng các dịch vụ không đồng bộ như vậy với các điểm cuối có thể định cấu hình.

Tôi rất hài lòng với khung công tác và nó đang trở thành một tiêu chuẩn defacto cho các hệ thống được kết nối mà chúng tôi xây dựng.


14
Lợi ích của phương pháp này so với việc sử dụng phụ trợ nhắn tin (ví dụ ActiveMQ) cho thông điệp của bạn là gì?
magiconair

27
Các sản phẩm MQ thực sự cho một trường hợp sử dụng khác nhau. đảm bảo khác nhau và hiệu suất rất khác nhau. Các sản phẩm MQ cần rất nhiều thiết lập, bạn sẽ không sử dụng hàng đợi trong một sản phẩm như vậy giống như cách bạn sử dụng các đối tượng. Các diễn viên là công dân hạng nhất trong akka, bạn sử dụng chúng tùy ý, tương tự như cách bạn sẽ sử dụng các đối tượng, do đó, có rất ít chi phí cả trong mô hình lập trình của bạn như trong thiết lập. Các sản phẩm MQ bạn sẽ sử dụng nhiều hơn để tích hợp với các hệ thống bên ngoài khác, không phải để xây dựng 'nội bộ' của hệ thống, đây là thứ bạn sẽ sử dụng cho các tác nhân.
Raymond Roestenburg

26
URL mới cho nghiên cứu trường hợp DBP là download.typesafe.com/website/casestudies/iêu
Bas

2
Xây dựng @RaymondRoestenburg re: hệ thống MQ và các giải pháp thay thế. RabbitMQ, ví dụ, được xây dựng trên ngôn ngữ lập trình dựa trên diễn viên, Erlang. Đó là một cách để suy nghĩ về mối quan hệ (và sự khác biệt) giữa diễn viên và MQ. Trong khi đó, Apache Spark không phải là công nhân và hàng đợi cũng như dựa trên diễn viên, BUT có thể được sử dụng với Akka: Formsafe trình bày cách sử dụng Spark Streaming với Akka .
driftcatcher

6
@RaymondRoestenburg Bạn đã bỏ qua việc đề cập rằng mô hình Actor as-is thúc đẩy cấu trúc giống như spaghetti. Cuốn sách "Akka in Action" mà bạn đã viết là minh chứng rõ nhất cho "tính năng" này. Các ví dụ mã xử lý các câu chuyện khá cơ bản. Tuy nhiên, quy trình làm việc là rất khó để hiểu và làm theo mã. Một vấn đề liên quan là mã Akka sẽ TUYỆT VỜI trên toàn bộ logic kinh doanh của bạn theo cách xâm phạm nhất mà bạn có thể tưởng tượng. Nhiều hơn bất kỳ khuôn khổ phi diễn viên khác. Đơn giản là không thể viết một quy trình công việc cơ bản mà không phân tích nó thành các phần riêng biệt khác nhau.
mừng

222

Tuyên bố miễn trừ trách nhiệm: Tôi là PO cho Akka

Bên cạnh việc cung cấp một smorgasbord đồng thời đơn giản hơn nhiều để lý do và để có được chính xác (diễn viên, tác nhân, dataflow concurrency) và với điều khiển đồng thời ở dạng STM.

Dưới đây là một số trường hợp sử dụng bạn có thể xem xét:

  1. Xử lý giao dịch (chơi game trực tuyến, tài chính, thống kê, cá cược, truyền thông xã hội, viễn thông, ...)
    • mở rộng quy mô, mở rộng quy mô, khả năng chịu lỗi / HA
  2. Dịch vụ phụ trợ (mọi ngành, mọi ứng dụng)
    • dịch vụ REST, SOAP, cometd vv
    • hoạt động như lớp trung tâm / lớp tích hợp
    • mở rộng quy mô, mở rộng quy mô, khả năng chịu lỗi / HA
  3. Đồng thời đính kèm / song song (bất kỳ ứng dụng nào)
    • Chính xác
    • Đơn giản để làm việc và hiểu
    • Chỉ cần thêm các tệp vào dự án JVM hiện tại của bạn (sử dụng Scala, Java, Groovy hoặc JRuby)
  4. Xử lý hàng loạt (bất kỳ ngành nào)
    • Tích hợp lạc đà để kết nối với các nguồn dữ liệu hàng loạt
    • Các diễn viên phân chia và chinh phục khối lượng công việc hàng loạt
  5. Trung tâm truyền thông (viễn thông, truyền thông web, phương tiện di động)
    • mở rộng quy mô, mở rộng quy mô, khả năng chịu lỗi / HA
  6. Máy chủ trò chơi (chơi game trực tuyến, cá cược)
    • mở rộng quy mô, mở rộng quy mô, khả năng chịu lỗi / HA
  7. BI / datamining / crunching mục đích chung
    • mở rộng quy mô, mở rộng quy mô, khả năng chịu lỗi / HA
  8. chèn các trường hợp sử dụng tốt đẹp khác ở đây

10
Tôi hiểu lợi ích của Futures và STM nhưng không tìm thấy trường hợp sử dụng tốt cho diễn viên. Đối với một trò chơi hoặc máy chủ cá cược, lợi thế của việc sử dụng Diễn viên so với nhiều máy chủ ứng dụng đằng sau bộ cân bằng tải là gì?
Martin Konicek

8
@ViktorKlang POs! = Trưởng nhóm công nghệ. Họ làm việc cùng nhau, nhưng là những vai trò khác nhau.
taylorcressy

79

Một ví dụ về cách chúng tôi sử dụng nó sẽ nằm trong hàng ưu tiên của các giao dịch thẻ ghi nợ / thẻ tín dụng. Chúng tôi có hàng triệu trong số này và nỗ lực của công việc phụ thuộc vào loại chuỗi đầu vào. Nếu giao dịch thuộc loại KIỂM TRA, chúng tôi có rất ít xử lý nhưng nếu đó là điểm bán thì có rất nhiều việc phải làm như hợp nhất với dữ liệu meta (danh mục, nhãn, thẻ, v.v.) và cung cấp dịch vụ (thông báo email / sms, phát hiện gian lận, số dư quỹ thấp, v.v.). Dựa trên loại đầu vào, chúng tôi soạn các lớp có nhiều đặc điểm khác nhau (được gọi là mixin) cần thiết để xử lý công việc và sau đó thực hiện công việc. Tất cả các công việc này đi vào cùng một hàng đợi trong chế độ thời gian thực từ các tổ chức tài chính khác nhau. Sau khi dữ liệu được xóa, nó sẽ được gửi đến các kho lưu trữ dữ liệu khác nhau để duy trì, phân tích hoặc đẩy đến kết nối ổ cắm hoặc để nâng diễn viên sao chổi. Các tác nhân làm việc liên tục tự tải cân bằng công việc để chúng tôi có thể xử lý dữ liệu nhanh nhất có thể. Chúng tôi cũng có thể tham gia vào các dịch vụ bổ sung, mô hình kiên trì và cho các điểm quyết định quan trọng.

Thông báo kiểu Erlang OTP truyền trên JVM tạo ra một hệ thống tuyệt vời để phát triển các hệ thống thời gian thực trên vai của các thư viện và máy chủ ứng dụng hiện có.

Akka cho phép bạn gửi tin nhắn như bạn truyền thống nhưng với tốc độ! Nó cũng cung cấp cho bạn các công cụ trong khung để quản lý số lượng lớn các nhóm tác nhân, các nút từ xa và khả năng chịu lỗi mà bạn cần cho giải pháp của mình.


1
Vì vậy, có công bằng không khi nói đó là trường hợp (một số) yêu cầu có độ trễ dài, trong đó một luồng cho mỗi yêu cầu sẽ không mở rộng tốt?
StaxMan

7
Tôi nghĩ rằng phần quan trọng của lập trình diễn viên nói chung là dòng thông điệp. Khi bạn bắt đầu khái niệm hóa các luồng dữ liệu không có tác dụng phụ, bạn chỉ muốn càng nhiều luồng xảy ra trên mỗi nút càng tốt. Điều này khác nhiều so với tính toán hiệu năng cao là bạn có các công việc bán đồng nhất không gửi tin nhắn và mất nhiều thời gian để xử lý. Tôi nghĩ rằng việc triển khai Fibonacci dựa trên diễn viên là một ví dụ rất hạn chế vì nó không trình bày lý do tại sao sử dụng diễn viên mà chỉ diễn viên đó làm tê liệt taks. Hãy suy nghĩ kiến ​​trúc hướng sự kiện cho các trường hợp sử dụng.
Wade Arnold

4
Kiến trúc hướng sự kiện là một cách nghĩ khác về các vấn đề. Thật đáng để đọc Erlang OTP trong hành động từ việc điều khiển nếu bạn đang nghĩ về việc mã hóa trong Akka. Rất nhiều cấu trúc trong akka bị ảnh hưởng bởi Erlang OTP và cuốn sách cung cấp cho bạn các nguyên tắc tại sao Jonas Boner xây dựng akka api theo cách ông đã làm. Akka là một ngọn núi lớn mà bạn đang đứng! Nếu các diễn viên của bạn kiên trì thông qua các thay đổi trạng thái, bạn có thực sự cần 10k viết lần thứ hai được duy trì không
Wade Arnold

8
Wade, làm thế nào để các bạn xử lý đảm bảo tin nhắn? bạn đề cập: (thông báo email / sms, phát hiện gian lận, số dư tiền thấp, v.v.), tôi cho rằng những thứ này có khả năng được gửi đến các tác nhân từ xa? Làm thế nào để bạn đảm bảo những hoạt động thực sự xảy ra? Điều gì xảy ra nếu nút không thành công trong khi xử lý cảnh báo gian lận? Nó sẽ biến mất mãi mãi? Bạn có một hệ thống phù hợp cuối cùng mà làm sạch nó? cảm ơn!
James

2
Câu hỏi hay đấy James. Rõ ràng là nó phù hợp trong một hệ thống mà không cần phải trả lời khẩn cấp. Ví dụ, bạn có thể xử lý hóa đơn thẻ tín dụng; tính toán; gửi e-mail, vv Tôi thực sự tự hỏi làm thế nào những điều này (giao dịch) được xử lý khi cần trả lời. Cuối cùng; nếu một yêu cầu được thực hiện từ bên ngoài (người dùng internet; đại diện từ trung tâm cuộc gọi, v.v.); anh ấy hoặc cô ấy chờ đợi một trả lời. Làm thế nào tôi có thể chắc chắn rằng các tác vụ phụ (được thực thi không đồng bộ) được thực thi; trong một giao dịch xa để tôi có thể trả lời?
Kaan Yy

44

Chúng tôi sử dụng Akka để xử lý các cuộc gọi REST không đồng bộ - cùng với máy chủ web async (dựa trên Netty), chúng tôi có thể cải thiện gấp 10 lần số lượng người dùng được phục vụ trên mỗi nút / máy chủ, so với luồng truyền thống trên mỗi mô hình yêu cầu người dùng.

Nói với sếp của bạn rằng hóa đơn lưu trữ AWS của bạn sẽ giảm theo hệ số 10 và nó là không có trí tuệ! Suỵt ... đừng nói với Amazon mặc dù ... :)


3
Và tôi đã quên đề cập rằng bản chất đơn nguyên của tương lai akka, dẫn đến mã song song sạch hơn nhiều đã giúp chúng tôi tiết kiệm hàng ngàn mã ...
piotrga

8
Tôi giả sử các cuộc gọi có độ trễ cao, thông lượng thấp? Giống như thực hiện cuộc gọi đến các máy chủ khác, chờ phản hồi (proxy)?
StaxMan

38

Chúng tôi đang sử dụng Akka trong một dự án Telco quy mô lớn (tiếc là tôi không thể tiết lộ nhiều chi tiết). Các diễn viên Akka được triển khai và truy cập từ xa bằng một ứng dụng web. Theo cách này, chúng tôi có một mô hình RPC được đơn giản hóa dựa trên trình tạo mẫu của Google và chúng tôi đạt được sự song song bằng cách sử dụng Akka Futures. Cho đến nay, mô hình này đã làm việc rực rỡ. Một lưu ý: chúng tôi đang sử dụng API Java.


Bạn có thể cho chúng tôi biết thêm một chút xin vui lòng? Afaik Futures không thể được gửi qua mạng (nối tiếp). Bạn có sử dụng nhiều tương lai và một vài diễn viên hoặc kết hợp giữa hai hoặc ...? Bạn sử dụng protobuf cho tất cả các tuần tự hóa và gửi dưới dạng tin nhắn cho các diễn viên?
Aktau

Điều này có vẻ như có thể được xử lý dễ dàng như vậy mà không có Akka.
Erik Kaplun

1
TDC là công ty Telco trong trường hợp của Fiaddesio.
Roman Kagan

37

Nếu bạn trừu tượng máy chủ trò chuyện lên một cấp, thì bạn sẽ có câu trả lời.

Akka cung cấp một hệ thống nhắn tin gần giống với tâm lý "hãy để nó sụp đổ" của Erlang.

Vì vậy, ví dụ là những thứ cần mức độ bền và độ tin cậy khác nhau của tin nhắn:

  • Máy chủ trò chuyện
  • Lớp mạng cho MMO
  • Bơm dữ liệu tài chính
  • Hệ thống thông báo cho iPhone / thiết bị di động / bất kỳ ứng dụng nào
  • Máy chủ REST
  • Có lẽ một cái gì đó giống với WebMachine (đoán)

Những điều tốt đẹp về Akka là những lựa chọn mà nó mang lại cho sự bền bỉ, đó là triển khai STM, máy chủ REST và khả năng chịu lỗi.

Đừng khó chịu với ví dụ về máy chủ trò chuyện, hãy nghĩ về nó như một ví dụ về một loại giải pháp nhất định.

Với tất cả tài liệu tuyệt vời của họ, tôi cảm thấy có một khoảng trống là câu hỏi, trường hợp sử dụng và ví dụ chính xác này. Hãy ghi nhớ các ví dụ là không tầm thường.

(Được viết chỉ với kinh nghiệm xem video và chơi với nguồn, tôi đã không thực hiện được gì khi sử dụng akka.)


2
Cảm ơn - Tôi không có nghĩa là máy chủ trò chuyện thực sự xấu, chỉ là tôi muốn có các ví dụ bổ sung; dễ dàng hơn để có được ý tưởng tốt hơn về tiềm năng.
StaxMan

Tò mò muốn biết làm thế nào máy chủ REST phù hợp ở đây? Bạn có đề cập đến nó trong ngữ cảnh của máy chủ async kiểu Node.js không? Cảm ơn đã chia sẻ các trường hợp sử dụng ví dụ. Tôi thấy chúng hữu ích.
phần

24

Chúng tôi sử dụng Akka trong một số dự án tại nơi làm việc, trong đó thú vị nhất là liên quan đến sửa chữa tai nạn xe cộ. Chủ yếu ở Anh nhưng hiện đang mở rộng sang Mỹ, Châu Á, Úc và Châu Âu. Chúng tôi sử dụng các tác nhân để đảm bảo rằng thông tin sửa chữa sự cố được cung cấp theo thời gian thực để cho phép sửa chữa xe an toàn và tiết kiệm chi phí.

Câu hỏi với Akka thực sự nhiều hơn "bạn không thể làm gì với Akka". Khả năng tích hợp với các khung mạnh mẽ, tính trừu tượng mạnh mẽ và tất cả các khía cạnh chịu lỗi khiến nó trở thành một bộ công cụ rất toàn diện.


Vì vậy, khía cạnh nào bạn thích nhất nếu bạn phải chọn? Tích hợp hiện tại cho các khung khác, khả năng chịu lỗi tự động, hoặc cái gì khác?
StaxMan

6
Theo quan điểm cá nhân, đó là mức độ trừu tượng được nâng lên mà Akka mang đến cho cái bàn mà tôi thích nhất. Từ góc độ doanh nghiệp, đó là khả năng tích hợp. Phải kiếm sống và Akka bao gồm cả việc kinh doanh và niềm vui cả hai rất độc đáo :-)
rossputin

Bạn có thể giải thích làm thế nào dòng chảy của tin nhắn? Người dùng có phải là người trong cửa hàng sửa chữa và nhập thông tin chi tiết về sự cố vào biểu mẫu http và sau đó gửi dữ liệu đến máy chủ. Điều này có tạo ra một thông điệp được xử lý bởi akka? Để làm gì với tin nhắn này? Trích xuất thông tin đã nhập để truy vấn cơ sở dữ liệu và sau đó xếp hàng trả lời để gửi lại cho web-frontend?
lướt sóng

24

Bạn có thể sử dụng Akka cho một số loại khác nhau.

Tôi đang làm việc trên một trang web, nơi tôi đã di chuyển kho công nghệ sang Scala và Akka. Chúng tôi đã sử dụng nó cho hầu hết mọi thứ xảy ra trên trang web. Mặc dù bạn có thể nghĩ rằng một ví dụ Trò chuyện là xấu, nhưng về cơ bản tất cả đều giống nhau:

  • Cập nhật trực tiếp trên trang web (ví dụ: lượt xem, lượt thích, ...)
  • Hiển thị ý kiến ​​người dùng trực tiếp
  • Dịch vụ thông báo
  • Tìm kiếm và tất cả các loại dịch vụ khác

Đặc biệt là các bản cập nhật trực tiếp rất dễ dàng vì chúng sôi nổi với những gì một ví dụ Trò chuyện ist. Phần dịch vụ là một chủ đề thú vị khác vì bạn chỉ cần chọn sử dụng các tác nhân từ xa và ngay cả khi ứng dụng của bạn không được phân cụm, bạn có thể dễ dàng triển khai nó đến các máy khác nhau.

Tôi cũng đang sử dụng Akka cho một ứng dụng tự động PCB với ý tưởng có thể mở rộng quy mô từ máy tính xách tay sang trung tâm dữ liệu. Bạn càng cung cấp nhiều năng lượng, kết quả sẽ tốt hơn. Điều này cực kỳ khó thực hiện nếu bạn cố gắng sử dụng đồng thời thông thường vì Akka cũng cung cấp cho bạn tính minh bạch về vị trí.

Hiện tại là một dự án thời gian rảnh, tôi đang xây dựng một khung web chỉ sử dụng các diễn viên. Một lần nữa, lợi ích là khả năng mở rộng từ một máy duy nhất đến toàn bộ cụm máy. Bên cạnh đó, sử dụng cách tiếp cận theo hướng thông điệp làm cho dịch vụ phần mềm của bạn được định hướng ngay từ đầu. Bạn có tất cả những thành phần tốt đẹp đó, nói chuyện với nhau nhưng không nhất thiết phải biết nhau, sống trên cùng một máy, thậm chí không ở trong cùng một trung tâm dữ liệu.

Và kể từ khi Google Reader ngừng hoạt động, tôi bắt đầu với một trình đọc RSS, sử dụng Akka tất nhiên. Đó là tất cả về các dịch vụ đóng gói cho tôi. Kết luận: Bản thân mô hình diễn viên là điều bạn nên áp dụng trước tiên và Akka là một khuôn khổ rất đáng tin cậy giúp bạn thực hiện nó với rất nhiều lợi ích bạn sẽ nhận được trên đường đi.


Xin chào Joe, bạn có thể giải thích cách tin nhắn được sử dụng để cập nhật trang web không? Bạn có một hệ thống cho tác giả nội dung; anh ta tạo ra một bài viết mới và nhấn lưu. Điều này có tạo ra một thông điệp được gửi đến một số máy chủ xử lý lưu lượng đến không. Mỗi máy chủ xử lý thông báo cập nhật ngay khi có thể. Mỗi yêu cầu trình duyệt mới sau đó có được phiên bản cập nhật của trang không? Cảm ơn bạn
lướt web

18

Chúng tôi đang sử dụng akka với plugin lạc đà của nó để phân phối phân tích và xử lý xu hướng cho twimpact.com . Chúng tôi phải xử lý từ 50 đến 1000 tin nhắn mỗi giây. Ngoài xử lý đa nút bằng lạc đà, nó cũng được sử dụng để phân phối công việc trên một bộ xử lý cho nhiều công nhân để có hiệu suất tối đa. Hoạt động khá tốt, nhưng đòi hỏi một số hiểu biết về cách xử lý tắc nghẽn.


bạn cũng đang sử dụng khả năng chịu lỗi của Akka phải không?
Erik Kaplun

Làm thế nào về Spark Streaming nếu chúng tôi có quyền truy cập vào cụm Spark?
skjagini

18

Tôi đã thử dùng Akka (Java api). Những gì tôi đã cố gắng là so sánh mô hình đồng thời dựa trên diễn viên của Akka với mô hình đồng thời Java đơn giản (các lớp java.util.conc hiện).

Trường hợp sử dụng là một bản đồ kinh điển đơn giản làm giảm việc thực hiện số lượng ký tự. Bộ dữ liệu là một tập hợp các chuỗi được tạo ngẫu nhiên (độ dài 400 ký tự) và tính toán số nguyên âm trong chúng.

Đối với Akka, tôi đã sử dụng Bal cânDispatcher (để cân bằng tải giữa các luồng) và RoundRobinRouter (để giữ giới hạn cho các tác nhân chức năng của tôi). Đối với Java, tôi đã sử dụng kỹ thuật nối ngã ba đơn giản (được triển khai mà không có bất kỳ thuật toán đánh cắp công việc nào) sẽ phân tách bản đồ / giảm thực thi và tham gia kết quả. Kết quả trung gian đã được tổ chức trong việc chặn hàng đợi để làm cho việc tham gia càng song song càng tốt. Có lẽ, nếu tôi không sai, điều đó sẽ bắt chước bằng cách nào đó khái niệm "hộp thư" của các diễn viên Akka, nơi họ nhận được tin nhắn.

Quan sát: Cho đến tải trung bình (~ 50000 đầu vào chuỗi) kết quả tương đương nhau, thay đổi một chút trong các lần lặp khác nhau. Tuy nhiên, khi tôi tăng tải lên ~ 100000, nó sẽ treo giải pháp Java. Tôi đã cấu hình giải pháp Java với 20-30 luồng trong điều kiện này và nó đã thất bại trong tất cả các lần lặp.

Tăng tải lên 1000000, cũng gây tử vong cho Akka. Tôi có thể chia sẻ mã với bất kỳ ai quan tâm để kiểm tra chéo.

Vì vậy, đối với tôi, có vẻ như Akka mở rộng tốt hơn giải pháp đa luồng Java truyền thống. Và có lẽ lý do là sự kỳ diệu của Scala.

Nếu tôi có thể mô hình hóa một miền vấn đề như một thông điệp hướng sự kiện đi qua một, tôi nghĩ Akka là một lựa chọn tốt cho JVM.

Thử nghiệm được thực hiện trên: Phiên bản Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. Ram 3GB. Bộ xử lý Intel Core i5, tốc độ xung nhịp 2,5 GHz

Xin lưu ý, miền vấn đề được sử dụng cho thử nghiệm có thể được tranh luận và tôi đã cố gắng công bằng như kiến ​​thức Java của tôi cho phép :-)


3
"Tôi có thể chia sẻ mã với bất kỳ ai quan tâm để kiểm tra chéo." Tôi muốn nếu bạn không phiền.
n1r3

3
Tôi cũng muốn mã, bạn có thể gửi một liên kết github?
Gautam

Cám ơn sự quan tâm của bạn. Thật không may, tôi có một số vấn đề khi thiết lập một repo github. Nếu bạn có thể cho tôi email của bạn, tôi có thể gửi qua mã nguồn. Và hối tiếc cho một trả lời muộn!
sutanu dalui

@sutanudalui Bạn vẫn có mã xin vui lòng, nếu vậy tôi có thể chia sẻ email của mình không?
Jay

16

Chúng tôi sử dụng Akka trong các hệ thống hộp thoại nói ( primetalk ). Cả bên trong và bên ngoài. Để chạy đồng thời nhiều kênh điện thoại trên một nút cụm đơn, rõ ràng cần phải có một số khung đa luồng. Akka hoạt động hoàn hảo. Chúng tôi có cơn ác mộng trước đó với java-concurrency. Và với Akka, nó giống như một chiếc xích đu - đơn giản là nó hoạt động. Mạnh mẽ và đáng tin cậy. 24 * 7, không ngừng.

Trong một kênh, chúng tôi có luồng sự kiện theo thời gian thực được xử lý song song. Cụ thể: - nhận dạng giọng nói tự động dài - được thực hiện với một diễn viên; - nhà sản xuất đầu ra âm thanh trộn một vài nguồn âm thanh (bao gồm cả lời nói tổng hợp); - chuyển đổi văn bản thành giọng nói là một tập hợp các tác nhân được chia sẻ giữa các kênh; - xử lý ngữ nghĩa và kiến ​​thức.

Để thực hiện kết nối xử lý tín hiệu phức tạp, chúng tôi sử dụng SynapseGrid . Nó có lợi ích của việc kiểm tra thời gian biên dịch của DataFlow trong các hệ thống tác nhân phức tạp.


14

Gần đây tôi đã triển khai ví dụ rút gọn bản đồ chính tắc trong Akka: Word Count. Vì vậy, đó là một trường hợp sử dụng của Akka: hiệu suất tốt hơn. Nó giống như một thử nghiệm của các diễn viên của JRuby và Akka hơn bất kỳ thứ gì khác, nhưng nó cũng cho thấy Akka không phải là Scala hay Java: nó hoạt động trên tất cả các ngôn ngữ trên JVM.


Bạn có biết những gì chịu trách nhiệm cho hiệu suất tốt hơn (và cũng so với thay thế nào)? Đó có phải là do sử dụng JRuby trên JVM (so với Ruby bản địa), scalalibiliy do I / O không chặn hoặc một cái gì khác không?
StaxMan

2
Sự so sánh tôi đã viết là: Jruby nối tiếp VS Jruby với các diễn viên. Do đó, điều duy nhất có thể chịu trách nhiệm cho việc thực hiện nhanh hơn là sự tham gia của các diễn viên. Không có I / O tham gia vào các thử nghiệm (một tệp được tải từ đĩa, nhưng nó được thực hiện trước khi bộ hẹn giờ chuẩn được đặt).
Daniel Ribeiro

Gần đây tôi cũng đã thực hiện một ví dụ về giảm bản đồ, nhưng đó chỉ là vanilla java github.com/chaostheory/jibenakka
chaostheory
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.