2009-04-27 33 views
5

Tôi làm việc trên các ứng dụng tài chính trong Java và nhận được quyền đồng thời là đau. Erlang và mô hình diễn viên được cho là phù hợp cho các ứng dụng đồng loạt ồ ạt nhưng tôi không thể tìm ra cách làm điều đó trong Java. Tôi biết có những thư viện như Jetlang, FunctionalJava, kilim, vv, nhưng chúng thường không vượt ra ngoài các ví dụ đơn giản.làm thế nào để làm diễn viên (erlang) trong java?

Giả sử tôi cần xử lý ba hoặc bốn sự kiện khác nhau, như tính một số số từ nguồn cấp dữ liệu thị trường, nguồn cấp dữ liệu đặt hàng/giao dịch và 'xuất' một số dẫn xuất của dữ liệu này. Hầu hết thời gian, các sự kiện hoặc luồng dữ liệu này cần được xử lý theo thứ tự (ít nhất là theo thứ tự đối với một số khóa ... ví dụ, tất cả các đơn đặt hàng cho một biểu tượng cụ thể phải được xử lý theo thứ tự, nhưng song song với đối với các ký hiệu không liên quan)

Tôi tạo một đối tượng Java bình thường với các phương thức làm thay đổi trạng thái. Thay vì để các phương thức đó thay đổi trạng thái trực tiếp, tôi đặt các tham số của chúng (bằng cách chuyển đổi chúng thành một đối tượng lệnh) trong hàng đợi năm mươi (hộp thư của erlang), và phương thức react() xử lý hàng đợi đó. Bằng cách này, tất cả các bản cập nhật phải trải qua một hàng đợi duy nhất và phương thức react() chỉ có thể được truy cập một bản cập nhật tại một thời điểm. Về mặt lý thuyết, điều này sẽ giúp tôi tiết kiệm được sự cần thiết phải khóa hoặc đồng bộ hóa trên phương pháp này.

Tuy nhiên, hàng đợi này về cơ bản là hàng đợi của nhà sản xuất/người tiêu dùng, có nghĩa là hàng đợi chặn. Chặn là rất xấu cho khả năng mở rộng. Ngoài ra, có một hàng đợi duy nhất có nghĩa là tất cả các đối tượng lệnh cập nhật của tôi (trong các kiểu khác nhau) đi ra khỏi hàng đợi với một kiểu siêu chung chung (như Object) và tôi phải đưa chúng trở lại đúng kiểu và cho phản ứng() xử lý chúng .

Khi đối tượng được tạo thành này tạo ra đầu ra, được tiêu thụ bởi một đối tượng khác như vậy, tôi sẽ trải qua quá trình tương tự. Nói cách khác, tôi đã thay đổi mô hình lập trình từ hướng đối tượng, với các phương thức trả về kết quả, cho một số dạng tiếp tục đi qua cơn ác mộng nơi tất cả các phương thức của tôi trở nên không đồng bộ.

Bất kỳ ý tưởng nào về cách tôi có thể tiếp cận điều này?

Trả lời

3

Sử dụng một trong những thư viện Actors xuất sắc gần đây đã xuất hiện. Alex Miller đã viết một phần hai phần tốt cho Javaworld on Actors.

Tôi cũng khá cá nhân như Actor's Guild.

+0

FYI, theo trang web của diễn viên, có vẻ như dự án không còn được duy trì nữa. –

5

Gần đây hơn akka cung cấp khung diễn viên cho Scala và dựa trên Erlang.

+0

thx. Điều này thật đúng với gì mà tôi đã tìm kiếm. Đó là tính năng Erlang trong Java. – comonad

0

Bạn cũng có thể muốn xem esper, không hoàn toàn ở mức thấp như khung diễn viên được đề cập, giống như hệ thống xử lý sự kiện tổng quát mà bạn xây dựng trên khuôn khổ diễn viên. Rất trưởng thành, hoàn chỉnh và tôi nghĩ rằng đã phát triển để xử lý sự kiện phức tạp trong các giao dịch tài chính.

0

Bạn có thể cân nhắc một lựa chọn, cụ thể là Netty cùng với Lmax Disruptor, cả trong số họ viết bằng java tinh khiết. Netty là khung ứng dụng mạng hướng sự kiện không đồng bộ để phát triển nhanh chóng các máy chủ giao thức hiệu suất cao có thể duy trì & khách hàng.

enter image description here

các Disruptor là gì?

LMAX là nền tảng giao dịch nhanh nhất trên thế giới. Rõ ràng, để đạt được điều này, chúng tôi cần phải làm một cái gì đó đặc biệt để đạt được độ trễ và thông lượng rất thấp với nền tảng Java của chúng tôi. Thử nghiệm hiệu suất cho thấy rằng việc sử dụng hàng đợi để truyền dữ liệu giữa các giai đoạn của hệ thống đã giới thiệu độ trễ, vì vậy chúng tôi tập trung vào tối ưu hóa khu vực này.

Disruptor là kết quả của nghiên cứu và thử nghiệm của chúng tôi. Chúng tôi thấy rằng bộ nhớ cache nhớ ở cấp CPU và khóa yêu cầu trọng tài hạt nhân đều cực kỳ tốn kém, vì vậy chúng tôi đã tạo một khung có "sự đồng cảm cơ học" cho phần cứng đang chạy ...

(điều này được lấy từ https://lmax-exchange.github.io/disruptor/)

Các vấn đề liên quan