2009-07-30 33 views
35

Tôi đã đọc rất nhiều về các hệ thống tài chính có độ trễ thấp (đặc biệt là từ trường hợp gián điệp công ty nổi tiếng) và ý tưởng về hệ thống độ trễ thấp đã xuất hiện trong đầu tôi. Có một triệu ứng dụng có thể sử dụng những gì các chàng trai đang làm, vì vậy tôi muốn tìm hiểu thêm về chủ đề này. Vấn đề là tôi không thể tìm thấy bất cứ điều gì có giá trị về chủ đề này. Ai có thể giới thiệu sách, trang web, ví dụ về hệ thống độ trễ thấp không?Lập trình độ trễ thấp

+0

Trường hợp gián điệp công ty nổi tiếng nào? –

+3

Người lập trình Goldman Sachs bị cáo buộc ăn cắp mã nguồn đến nền tảng giao dịch tần số cao của họ: http://ftalphaville.ft.com/blog/2009/07/08/60761/the-cold-war-in-high-frequency-trading/ – mattnewport

+0

Cảm ơn Matt! –

Trả lời

4

Mọi thứ về lập trình thời gian thực sẽ phù hợp với hóa đơn. Nó không chính xác những gì bạn đang sau, tôi nghi ngờ, nhưng đó là một nơi rất tốt để bắt đầu.

+1

Thực lập trình thời gian không phải là độ trễ thấp, nó phản ứng lại với các sự kiện trong một khoảng thời gian nhất định, không nhất thiết là một sự kiện nhanh. – user997112

1

Nếu tôi nhớ chính xác thời gian thực Java (RTSJ) được sử dụng trong khu vực này, mặc dù tôi không thể tìm thấy bài viết hay để liên kết đến bây giờ.

+0

Tôi đang làm việc trên RTSJ. Đáng buồn là không có bản phát hành RTSJ nào nữa. (Oracle ngừng phát hành RTSJ và hỗ trợ cho nó). Nó chủ yếu tránh Dừng tất cả vào bộ sưu tập rác. – BalaB

5

Vâng, nó không chỉ là "truyền thống" lập trình thời gian thực, tất cả mọi thứ của nó. tôi làm việc cho một sàn giao dịch chứng khoán - tốc độ là vua. một vấn đề điển hình là cách nhanh nhất để ghi vào một tập tin là gì? cách nhanh nhất để sắp xếp một đối tượng là gì? v.v.

+0

Bạn sử dụng ngôn ngữ nào cho phần mềm của mình, C/C++ hoặc ngôn ngữ nào khác? –

1

Thông thường, làm việc trong môi trường có độ trễ thấp có nghĩa là có hiểu biết về phụ thuộc cuộc gọi và cách giảm chúng để giảm thiểu chuỗi phụ thuộc. Điều này bao gồm việc sử dụng các cấu trúc dữ liệu và các thư viện để lưu trữ dữ liệu có thể lưu trữ mong muốn cũng như tái cấu trúc các tài nguyên hiện có để giảm các phụ thuộc lẫn nhau.

42

Tôi làm việc cho một công ty tài chính sản xuất phần mềm có độ trễ thấp để liên lạc trực tiếp với các sàn giao dịch (để gửi giao dịch và giá trực tuyến). Chúng tôi hiện đang phát triển chủ yếu trong Java. Trong khi bên độ trễ thấp không phải là khu vực tôi làm việc trực tiếp, tôi có ý tưởng công bằng về kỹ năng cần thiết, bao gồm những điều sau đây theo ý kiến ​​của tôi:

  • Kiến thức chi tiết về mô hình bộ nhớ Java và kỹ thuật cần tránh thu gom rác không cần thiết (ví dụ: tổng hợp đối tượng). Một số kỹ thuật được sử dụng thường có thể được coi là "chống mẫu" trong môi trường OO truyền thống.
  • Kiến thức chi tiết về TCP/IP và UDP đa phương tiện bao gồm các tiện ích để gỡ lỗi và đo độ trễ (ví dụ: DTrace trên Solaris).
  • Trải nghiệm với các ứng dụng lược tả.
  • Hiểu biết về gói java.nio, trải nghiệm phát triển các ứng dụng máy chủ có khả năng mở rộng dựa trên NIO, trải nghiệm thiết kế giao thức dây. Cũng lưu ý rằng chúng tôi thường tránh sử dụng các khung công tác và thư viện bên ngoài (ví dụ: Google Protobuf), thích viết nhiều mã riêng biệt hơn.
  • Kiến thức về FIX và thư viện FIX thương mại (ví dụ: Cameron FIX).

Thật không may, nhiều kỹ năng chỉ có thể được phát triển "trong công việc" vì không có thay thế cho trải nghiệm đã thực hiện máy chủ giá hoặc công cụ giao dịch dựa trên thông số kỹ thuật. từ một trao đổi hoặc nhà cung cấp. Tuy nhiên, điều đáng nói đến là công ty chúng tôi ít nhất có xu hướng không phải để tìm kiếm trải nghiệm cụ thể trong khu vực thích hợp (hoặc khác) này, thay vì muốn thuê những người có kỹ năng phân tích và giải quyết vấn đề tốt.

+7

Độ trễ thấp và Java? có vẻ như một loại oxymoron. –

+6

@ZamfirKerlukson: chúng tôi có một ứng dụng nhắn tin Java xử lý các thư đến trong 8-9 micro giây. Quy trình ứng dụng máy chủ phức tạp hơn của chúng tôi trong 65-80 micro giây. Một điều cần ghi nhớ về Java là khả năng của trình biên dịch JIT để thực hiện phân tích mã và các phương thức nội tuyến động và truy cập dữ liệu. Điều đó tự động hóa những gì các lập trình viên C làm bằng tay với từ khóa "nội tuyến". Tuy nhiên, việc kiểm soát thời gian tạm dừng GC là thách thức (mặc dù có một số giải pháp JVM cố gắng giải quyết vấn đề này). –

+0

Độ trễ thấp trong Java ??? Làm thế nào nó có thể ??? Nếu bạn muốn đi độ trễ thấp, ít nhất bạn nên chuyển sang C/C++ hoặc thậm chí là lắp ráp. Tôi đang làm việc cho cổng trao đổi độ trễ thấp và chúng tôi có thể nhận 10-20 cho một gói xử lý bao gồm phân tích cú pháp, kiểm tra rủi ro, phân bổ cơ sở dữ liệu, FIX để chuyển đổi thư gốc, trong C++. Với Java, nó chỉ trở thành hoàn toàn sai trong một ngày. –

3

Hãy xem ZeroMQ. http://www.zeromq.org

Đọc các trang trắng trên trang web đó và bạn sẽ nhận được một số thông tin chi tiết về những gì cần thiết cho lập trình độ trễ thấp.

1

Nếu bạn đang nói về thiết kế máy chủ độ trễ thấp, đây là một số gợi ý tốt: http://www.kegel.com/c10k.html http://pl.atyp.us/content/tech/servers.html

19

Độ trễ thấp là một chức năng của nhiều thứ, hai điều quan trọng nhất là:

  • độ trễ mạng - tức là thời gian thực hiện trên mạng để truyền/nhận tin nhắn.
  • độ trễ xử lý - tức là thời gian mà ứng dụng của bạn thực hiện để thực hiện thông báo/sự kiện.

Vì vậy, nếu bạn đang viết một hệ thống Đối sánh đơn đặt hàng, độ trễ mạng sẽ đại diện cho bạn sẽ sớm nhận được yêu cầu khớp lệnh trong bao lâu. Và thời gian chờ xử lý sẽ đại diện cho thời gian mà ứng dụng của bạn thực hiện để khớp với Đơn hàng so với các đơn hàng đang mở, hiện có.

Multicast, UDP, multicast đáng tin cậy, Kernel bypass (được hỗ trợ bởi Java 7, Informatica Ultra Messaging, và nhiều người khác) trên mạng Infiniband là một số công nghệ phổ biến được sử dụng bởi tất cả các công ty trong lĩnh vực này.

Ngoài ra, có các khung lập trình độ trễ thấp như trình ngắt (http://code.google.com/p/disruptor/) thực hiện các mẫu thiết kế để xử lý các ứng dụng có độ trễ thấp. Điều gì có thể giết bạn là phải ghi vào một tệp DB hoặc tệp nhật ký như là một phần của quy trình làm việc chính của bạn. Bạn sẽ phải đưa ra các giải pháp duy nhất đáp ứng các yêu cầu của vấn đề mà bạn đang cố gắng giải quyết.

Trong các ngôn ngữ như Java, triển khai ứng dụng của bạn sao cho nó tạo ra (gần như) không rác thải trở nên vô cùng quan trọng đối với độ trễ. Như Adamski nói, có kiến ​​thức về mô hình bộ nhớ Java là cực kỳ quan trọng. Hiểu các triển khai JVM khác nhau và các hạn chế của chúng. Các mẫu thiết kế Java điển hình xung quanh việc tạo đối tượng nhỏ là những thứ đầu tiên bạn sẽ ném ra ngoài cửa sổ - người ta không bao giờ có thể sửa Java Garbage Collector đủ để đạt độ trễ thấp - thứ duy nhất có thể sửa được là rác.

Chúc may mắn!

6

Có nhiều câu trả lời hay trong bài đăng này. Tôi muốn thêm kinh nghiệm của tôi cũng

  • Để đạt được độ trễ thấp trong java bạn phải nắm quyền kiểm soát của GC trong java, có rất nhiều cách để làm điều đó cho ví dụ như tiền phân bổ đối tượng (tức là sử dụng mẫu thiết kế hạng ruồi), sử dụng các đối tượng nguyên thủy - trove rất tốt, tất cả cấu trúc dữ liệu dựa trên nguyên thủy, Tái sử dụng đối tượng ví dụ như tạo từ điển hệ thống rộng để giảm việc tạo đối tượng mới, tùy chọn rất tốt khi đọc dữ liệu từ stream/socket/db

    • Cố gắng sử dụng bản ngã chờ (hơi khó), khóa bản ngã miễn phí. Bạn có thể tìm thấy hàng tấn ví dụ cho rằng

    • Sử dụng tính toán trong bộ nhớ. Bộ nhớ là rẻ, bạn có thể có byte dữ liệu trong bộ nhớ.

    • Nếu bạn có thể nắm vững kiến ​​thức bit-khôn ngoan thì nó mang lại hiệu suất rất tốt.

    • Sử dụng mechnical cảm - Tham khảo gây rối loạn Lmax, khuôn khổ tuyệt vời

3

Nếu bạn quan tâm trong Java có độ trễ thấp đang phát triển, bạn nên biết rằng nó có thể được thực hiện mà không có một RTSJ (gian thực Thời gian) JVM cung cấp rằng bạn giữ Garbage Collector dưới sự kiểm soát. Tôi đề nghị bạn hãy xem this article mà nói về Phát triển Java mà không cần GC. Chúng tôi cũng có nhiều bài viết khác trong our site nói về các thành phần Java có độ trễ thấp.

2

Tôi muốn đưa ra một số nhận xét về Lập trình độ trễ thấp. Hiện tại tôi có hơn 5 năm kinh nghiệm trong việc phát triển độ trễ thấp và công cụ thực thi cao trong phần mềm tài chính.

Có cần phải hiểu độ trễ là gì không?

Độ trễ có nghĩa là cần thời gian để hoàn tất quy trình của bạn. Nó không nhất thiết phụ thuộc vào các công cụ phát triển bạn đang sử dụng, như java, C++, net, vv, nó phụ thuộc vào kỹ năng lập trình và hệ thống của bạn.

Giả sử bạn đang sử dụng java nhưng một lỗi do bạn có thể làm chậm trễ trong quy trình. Ví dụ bạn đã phát triển một ứng dụng giao dịch, trong đó mỗi lần làm mới giá bạn gọi một số chức năng và vân vân. Điều này có thể dẫn đến các biến phụ, sử dụng bộ nhớ không cần thiết, các vòng không cần thiết có thể gây chậm trễ trong tiến trình. Cùng một ứng dụng được phát triển trong .net có thể hoạt động tốt hơn so với java nếu nhà phát triển quan tâm đến những sai lầm ở trên.

Nó cũng phụ thuộc vào hệ thống máy chủ của bạn, giống như hệ thống đa bộ xử lý có thể hoạt động tốt nếu ứng dụng của bạn đa luồng.