2009-05-30 9 views
14

Bối cảnh: Tôi đang viết ứng dụng web 'chuẩn' (không có gì đặc biệt) trong Ruby (không phải Rails) và tôi cần bắt đầu suy nghĩ về triển khai.Sử dụng JRuby cho các ứng dụng web của Ruby? Nó có đáng không?

Vì vậy, tôi đã nghe rất nhiều khuyến nghị để sử dụng JRuby để triển khai các ứng dụng web của Ruby, bất kể bạn có thực sự cần thư viện Java hay không. Điều này đúng như thế nào? Có đáng sử dụng việc thực thi Java chỉ cho tốc độ không? Tôi sẽ kiếm được gì khác bằng cách làm như vậy? Tôi có gặp phải bất kỳ vấn đề nào không?

PS: Tôi không biết Java tốt, vì vậy "bạn có thể viết các phần của nó trong Java" không phải là rất hữu ích.

Trả lời

21

JRuby là một trong những triển khai Ruby hoàn chỉnh nhất (có rất nhiều ứng dụng khác ngoài đó như IronRuby, Maglev, Rubinius, XRuby, YARV, MacRuby). Nó là rất toàn diện, do đó, trừ khi bạn sử dụng đá quý sử dụng mã C bản địa, bạn sẽ rất rất có khả năng chỉ là tốt tương thích khôn ngoan.

JRuby nhanh hơn một chút so với triển khai C thực tế, nhưng nó hỗ trợ các chuỗi thực tế, trong khi việc triển khai chính thức đang gặp khó khăn trong việc thực hiện nó (nó vẫn sử dụng Green Threads). Sử dụng các chủ đề Java từ JRuby là khá tầm thường, mặc dù nó sẽ yêu cầu bạn kết hợp mã của bạn với Java (với một chút DI, việc ghép nối này sẽ chỉ xảy ra một lần, mặc dù).

Lợi ích khác: công cụ thời gian chạy. Java, dưới dạng nền tảng , thay vì ngôn ngữ, có công cụ thời gian chạy để giúp bạn chẩn đoán vấn đề và kiểm tra trạng thái của đơn đăng ký (profilers, JConsole, v.v.).

Twitter kỹ sư cũng nói rằng Ruby VM kinda có rắc rối trở thành một môi trường cho quá trình dài sống, trong khi JVM là rất tốt ở đó, bởi vì nó được tối ưu hóa cho rằng trong mười năm trở lại đây.

Ruby cũng có một vấn đề bảo mật nhỏ gần đây, điều này không ảnh hưởng đến việc thực hiện JRuby.

Mặt khác, dự án của bạn yêu cầu nhiều hiện vật hơn (JVM, lọ JRuby, v.v.). Nếu bạn đang sử dụng một ứng dụng sẽ sống lâu và bạn muốn hỗ trợ thời gian chạy tốt hơn, JRuby có thể là một cách tuyệt vời để thực hiện. Nếu không, bạn có thể an toàn chờ đợi cho đến khi bạn cần những thứ này để thực sự thực hiện việc di chuyển (nó có khả năng diễn ra suôn sẻ).

+1

xuất sắc trả lời, đó chính xác là những gì tôi cần phải biết. Cảm ơn. :) –

+3

Các nhà phát triển Twitter 'đưa vào Ruby là một chút quan trọng. Nếu vấn đề là những gì họ nói, điều hợp lý sẽ là đi cùng với JRuby. Họ không chuyển mã Ruby của họ sang Java - họ viết lại nó trong Scala. Có vẻ như vấn đề của họ nhiều hơn với mã của họ so với MRI. – Chuck

+4

Cũng lưu ý rằng di chuyển Twitter Ruby-Scala chủ yếu nằm trong phần xếp hàng của ứng dụng, mà (a) họ thừa nhận đã được thực hiện kém trong Ruby và (b) phù hợp với ngôn ngữ hiệu năng cao. –

6

Tôi sử dụng và yêu JRuby trên cơ sở hàng ngày, nhưng tôi khuyên bạn nên sử dụng MRI (a.k.a. C-Ruby) trừ khi bạn có nhu cầu thực tế đối với JRuby.

Lý do cho việc sử dụng JRuby:

hội nhập
  1. Java
  2. môi trường hạn chế (máy tính của bạn đã cài đặt Java bằng cách không ruby ​​và bạn không cần phải root)
  3. môi trường hạn chế (bạn đã cài đặt ruby ​​nhưng không có gốc để không thể cài đặt đá quý mà bạn cần)
  4. Bạn đã đạt đến giới hạn của hiệu suất Ruby 1.8 và không thể sử dụng 1.9

Từ những gì bạn đã mô tả, bạn không có bất kỳ lý do nào ở trên.

C-Ruby 1.9 có cải tiến hiệu suất đáng kể so với C-Ruby 1.8. Tôi chưa đọc (hoặc tìm hiểu cho bản thân mình) cách C-Ruby 1.9 so sánh với JRuby 1.8 hoặc JRuby 1.9. Trong anycase, bạn không có một vấn đề hiệu suất (chưa) vì vậy đừng lo lắng về nó.

Tin vui là, bạn có thể bắt đầu bằng hoặc chuyển đổi sau này nếu cần. Đó là tất cả Ruby, và đá quý Webrick và Mongrel làm việc với cả hai.

Như đã đề cập ở trên, đá quý ruby ​​có phần mở rộng C không thể được cài đặt trong JRuby. Hy vọng rằng điều này sẽ thay đổi trong tương lai nếu ruby ​​C mở rộng sử dụng FFI.

http://kenai.com/projects/ruby-ffi/pages/Home

http://isitjruby.com/

+0

Tôi không sử dụng bất kỳ phần mở rộng C nào không có Java tương đương, do đó, đó không phải là một vấn đề. Tôi có hai ưu đãi cho việc sử dụng JRuby tại thời điểm này: 1) chủ đề thực sự so với chủ đề "giả" mà MRI và YARV sử dụng (mặc dù tôi đoán đó không phải là một thỏa thuận quá lớn), và 2) truy cập vào các thư viện Java (mà, như Tôi đã nói ở trên, có nghĩa là tôi có thể sử dụng một cơ sở dữ liệu Java cụ thể, hoặc bất cứ điều gì như thế). MRI/YARV có thể khớp với điều đó không? –

+0

Nếu bạn đang nghĩ đến việc đa luồng, thì chủ đề thực sự của JRuby tôi nghĩ là một vấn đề lớn. Với thiết kế thay thế, cho C-Ruby, bạn có thể sử dụng các kỹ thuật BackgroundRb http://backgroundrb.rubyforge.org/ hoặc các kỹ thuật "giảm tải" khác như tin nhắn đáng tin cậy http://github.com/assaf/reliable-msg/tree/master – Rob

+0

Hmm, BackgroundRb trông thú vị, tôi sẽ xem! Cảm ơn! –