EJB's - เมื่อใดจึงควรใช้ Remote และ / หรือ Local interfaces


180

ฉันใหม่กับ Java EE และฉันพยายามทำความเข้าใจแนวคิดของ Local interfaces และ Remote interfaces ฉันได้รับแจ้งว่าหนึ่งในข้อดีที่สำคัญของ Java EE คือง่ายต่อการปรับขนาด (ซึ่งฉันเชื่อว่าคุณสามารถปรับใช้ส่วนประกอบที่แตกต่างกันบนเซิร์ฟเวอร์ที่แตกต่างกัน) นั่นคือสิ่งที่อินเทอร์เฟซระยะไกลและท้องถิ่นมา คุณควรจะใช้อินเทอร์เฟซระยะไกลหรือไม่หากคุณคาดว่าแอปพลิเคชันของคุณจะมีส่วนประกอบที่แตกต่างกันในเซิร์ฟเวอร์ที่แตกต่างกัน และใช้ Local interfaces หากแอปพลิเคชันของคุณอยู่บนเซิร์ฟเวอร์เดียวเท่านั้นหรือ

หากสมมติฐานของฉันถูกต้องคุณจะเลือกว่าจะใช้ Local หรือ Remote interfaces สำหรับแอปพลิเคชั่นใหม่โดยที่คุณไม่แน่ใจว่าปริมาณการรับส่งข้อมูลจะเป็นเท่าใด เริ่มต้นด้วยการใช้ Local interfaces และค่อยๆอัพเกรดเป็น Remote interfaces ที่ใช้งานได้?

ขอบคุณสำหรับการชี้แจงและข้อเสนอแนะ

คำตอบ:


186

ฉันใหม่กับ Java EE และฉันพยายามทำความเข้าใจแนวคิดของ Local interfaces และ Remote interfaces

ในเวอร์ชั่นเริ่มต้นของข้อมูลจำเพาะ EJB EJB เป็น "สันนิษฐาน" เป็นส่วนประกอบระยะไกลและวิธีเดียวที่จะเรียกใช้งานได้คือทำการโทรทางไกลโดยใช้ความหมายของ RMI และค่าใช้จ่ายทั้งหมดนั้นหมายถึง (การเรียกเครือข่ายและการทำให้เป็นอันดับวัตถุ การเรียกใช้เมธอด) ลูกค้า EJB ต้องจ่ายค่าปรับประสิทธิภาพนี้แม้ว่าจะจัดวางในเครื่องเสมือนเดียวกันกับคอนเทนเนอร์ EJB

ต่อมาซันตระหนักว่าแอปพลิเคชันทางธุรกิจส่วนใหญ่ไม่ได้กระจาย EJB ในระดับที่แตกต่างกันและพวกเขาแก้ไขสเป็ค (ใน EJB 2.0) โดยนำเสนอแนวคิดของ Local Interface เพื่อให้ลูกค้าจัดวางในเครื่องเสมือนเดียวกันกับคอนเทนเนอร์ EJB สามารถโทร EJB ได้ การเรียกใช้เมธอดโดยตรงโดยอ้อมผ่านความหมาย RMI ทั้งหมด (และค่าใช้จ่ายที่เกี่ยวข้อง)

ฉันได้รับการบอกแล้วว่าหนึ่งในข้อดีของ Java EE คือง่ายต่อการปรับขนาด (ซึ่งฉันเชื่อว่าคุณสามารถปรับใช้ส่วนประกอบต่าง ๆ บนเซิร์ฟเวอร์ที่แตกต่างกัน)

Java EE สามารถปรับขนาดได้ แต่นี่ไม่ได้แปลว่าจะกระจายคอมโพเนนต์ คุณสามารถรันแอปพลิเคชัน Web + EJB บนคลัสเตอร์โดยไม่ต้องแยกระดับเว็บและระดับ EJB

คุณควรจะใช้อินเทอร์เฟซระยะไกลหรือไม่หากคุณคาดว่าแอปพลิเคชันของคุณจะมีส่วนประกอบที่แตกต่างกันในเซิร์ฟเวอร์ที่แตกต่างกัน และใช้ Local interfaces หากแอปพลิเคชันของคุณอยู่บนเซิร์ฟเวอร์เดียวเท่านั้นหรือ

ฉันอยากจะพูดแบบนี้: ใช้ remote interface ถ้าไคลเอนต์ไม่ได้อยู่ใน JVM เดียวกัน (นี่ไม่ได้หมายความว่าใช้เพียงเซิร์ฟเวอร์เดียว / JVM)

(... ) เริ่มต้นโดยใช้ Local Interface และค่อยๆอัพเกรดเป็น Remote interfaces ที่ใช้งานได้?

ฉันอาจจะเริ่มจากการใช้ Local interfaces และตามคำแนะนำแล้วการสลับไปใช้อินเทอร์เฟซระยะไกลนั้นไม่จำเป็นเสมอไป (คุณสามารถทำคลัสเตอร์โครงสร้างcollocated )

ฉันขอแนะนำให้ตรวจสอบทรัพยากรที่กล่าวถึงด้านล่าง (2 รายการแรกค่อนข้างเก่า แต่ยังมีความเกี่ยวข้องและ 2 รายการล่าสุดกว่า)

ทรัพยากร


2
ฉันพบว่าคำถามนี้น่าสนใจ คุณหมายถึงอะไรโดย "การสลับไปใช้อินเทอร์เฟซระยะไกลไม่จำเป็นอย่างยิ่ง"? หมายความว่าเมื่อคุณเพิ่มไคลเอนต์ใหม่นอก JVM เดียวกันคุณไม่จำเป็นต้องสร้างอินเทอร์เฟซระยะไกลหรือไม่
mohamida

2
@Josek ขอบคุณดีใจที่คุณชอบ @mohamida ฉันมีการเปลี่ยนแปลงเล็กน้อยในการใช้ถ้อยคำ สิ่งที่ฉันหมายถึงคือคุณสามารถจัดโครงสร้างโครงสร้างการจัดกลุ่ม
Pascal Thivent

1
ขอบคุณสำหรับคำตอบและแหล่งข้อมูลเพิ่มเติมพวกเขามีประโยชน์มาก ดูเหมือนว่าจะมีการปรับขนาดแอปพลิเคชันเว็บสองสามวิธี ... นั่นคือการกระจายส่วนประกอบต่างๆ เซิร์ฟเวอร์จำนวนมาก?) และฉันคิดว่าคุณสามารถใช้การรวมกันของทั้งสอง? โดยบังเอิญคุณรู้หนังสือดี ๆ ในหัวข้อนี้หรือไม่? ขอบคุณอีกครั้ง!
Brian DiCasa

2
@Brian It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?ใช่มันเป็นแบบนั้น Do you, by chance know of good books on this topic?น่าเศร้าที่ไม่ฉันไม่รู้จักทรัพยากรสัมบูรณ์ "ZE" หากมีอยู่ ฉันได้เพิ่มแหล่งข้อมูลเพิ่มเติมโดยอ้างอิงบางอย่าง
Pascal Thivent

ลิงก์ทรัพยากรแรกตาย
Viacheslav Dobromyslov

48

ในขณะที่ฉันเห็นด้วยกับสิ่งที่เขียนข้างต้นส่วนใหญ่ฉันต้องการปรับแต่งความคิด "วิธีการเริ่มต้น" เล็กน้อย

คำแนะนำของฉันสำหรับคุณคือไม่เคยตั้งโปรแกรมโดยตรงกับส่วนต่อประสาน EJB ภายในรหัสของคุณ ใช้อินเทอร์เฟซที่เน้นธุรกิจเป็นประจำตั้งโปรแกรมให้กับมัน (หมายถึงมีวิธีการเรียกใช้โค้ดของคุณบนอินเทอร์เฟซที่มุ่งเน้นธุรกิจ) และให้รหัส "กาว" EJB เป็นการใช้งานแบบเสียบได้ โปรแกรมของคุณควรให้ความสำคัญกับตรรกะทางธุรกิจและไม่ใช่ในรายละเอียดการใช้งานเช่น EJB

ด้วยวิธีนี้คุณสามารถสลับไปมาระหว่างการใช้งานระยะไกลและท้องถิ่น - และหากคุณใช้คอนเทนเนอร์ IoC เช่น Spring คุณสามารถทำได้โดยใช้การกำหนดค่าเท่านั้น

หมายเหตุพิเศษเกี่ยวกับการเปลี่ยนจากโลคัลเป็นรีโมต: โปรดทราบว่ามีความแตกต่างทางความหมายระหว่างสองรายการนี้ ตัวอย่างเช่นการเรียกใช้วิธี EJB ผ่านผลลัพธ์ "ส่วนต่อประสานระยะไกล" ในอาร์กิวเมนต์ที่ถูกส่งผ่านโดยค่าในขณะที่เรียกผ่านผลลัพธ์ "ส่วนต่อประสานภายในเครื่อง" ในข้อโต้แย้งที่ถูกส่งผ่านโดยการอ้างอิง นี่คือความแตกต่างที่สำคัญ ดังนั้นหากคุณ "เริ่มต้นด้วยท้องถิ่น" ตรวจสอบให้แน่ใจว่าคุณได้ออกแบบระบบของคุณในลักษณะที่ต้องคำนึงถึงความหมาย "ระยะไกล" ด้วย

หากการออกแบบของคุณขึ้นอยู่กับวิธีการ EJB การเปลี่ยนวัตถุที่ส่งผ่านแล้วมันจะเป็นเรื่องยากสำหรับคุณที่จะ "สลับไปยังระยะไกล" ในภายหลัง อาจจะเป็นไปไม่ได้

โชคดี.


2
ดูเหมือนจะเป็นอีกเหตุผลหนึ่งที่ทำให้ความไม่แน่นอนลดลงต่อจาวาที่มีประสิทธิภาพ สิ่งนี้จะช่วยให้มีความยืดหยุ่นในการ "เปลี่ยนเป็นรีโมต" สำหรับอินเตอร์เฟสประเภท RMI กับ EJB หรือไม่
พฤหัสบดีที่

19

ตามสเป็ค EJB 3.2 EJB สามารถเป็นได้ทั้งในท้องถิ่นหรือระยะไกล อินเตอร์เฟสธุรกิจไม่สามารถเป็นได้ทั้งแบบโลคัลและแบบรีโมตในเวลาเดียวกัน

@Local ถั่วที่ใส่หมายเหตุประกอบสามารถเข้าถึงได้หากอยู่ในแอปพลิเคชันเดียวกันเท่านั้น

@Remote ถั่วที่ใส่หมายเหตุประกอบสามารถเข้าถึงได้ผ่านแอปพลิเคชันที่แตกต่างกันอยู่ใน jvms ที่ต่างกันหรือข้ามแอปพลิเคชันเซิร์ฟเวอร์

ดังนั้นสิ่งสำคัญที่ควรทราบคือ:

  1. หากคลาส bean มี@Remoteหมายเหตุประกอบดังนั้นอินเตอร์เฟสที่นำไปใช้งานทั้งหมดจะต้องเป็นรีโมต
  2. หากคลาส bean ไม่มีหมายเหตุประกอบหรือหากระบุ@Localหมายเหตุประกอบอินเตอร์เฟสที่ปรับใช้ทั้งหมดจะถือว่าเป็นโลคัล
  3. อินเทอร์เฟซใด ๆ ที่กำหนดไว้อย่างชัดเจนสำหรับถั่วซึ่งไม่มีส่วนต่อประสานจะต้องประกาศเป็น @Local
  4. การเปิดตัว EJB 3.2 มีแนวโน้มที่จะให้ข้อมูลที่ละเอียดยิ่งขึ้นสำหรับสถานการณ์ที่จำเป็นต้องกำหนดอย่างชัดเจน

1
คำถาม: คุณสามารถใช้@Localเพื่อเรียกใช้ EJB ในแอปพลิเคชันอื่น (JAR, WAR, EAR) แต่เป็น JVM เดียวกันได้หรือไม่
วิธี Carlitos

@PritamBanerjee ความคิดใด ๆ เกี่ยวกับ Carlitos Wa ฉันกำลังเผชิญกับปัญหาเดียวกัน EJB อยู่ในคลัสเตอร์ที่แตกต่างกันและไคลเอ็นต์แอปเซิร์ฟเล็ตอยู่ในแอปที่แตกต่างกัน
Govi S

@GovindaSakhare ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ ขออภัย :(
Pritam Banerjee

7

นี่อาจเป็นคำตอบสำหรับคุณ:

โดยทั่วไป Enterprise Java Bean ของคุณจะต้องใช้มุมมองไคลเอนต์ระยะไกลในกรณีที่คุณวางแผนที่จะใช้ bean ในสภาพแวดล้อมแบบกระจาย กรณีเหล่านี้เป็นกรณีที่ไคลเอนต์ที่จะทำงานด้วยจะอยู่ใน Java Virtual Machine (JVM) อื่น ในกรณีของมุมมองรีโมตไคลเอ็นต์การเรียกใช้เมธอดใด ๆ จากอินเตอร์เฟสโฮมรีโมตและ / หรืออินเตอร์เฟสคอมโพเนนต์แบบรีโมตจะถูกจัดการผ่านรีโมตเมธอดแบบรีโมต (RMI)

EJB สามารถใช้มุมมองโลคัลไคลเอ็นต์ได้หากรับประกันได้จริง ๆ ว่า enterprise beans หรือไคลเอ็นต์อื่นจะระบุแอดเดรส bean ภายใน JVM เดียวเท่านั้น หากเป็นกรณีนี้การเข้าถึงดังกล่าวจะดำเนินการด้วยวิธีการโทรโดยตรงแทน RMI

ที่มา: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.