1 / 48

טיפים מעשיים – פתרון חמש בעיות עיקריות בפיתוח יישומי J2EE מורכבים

טיפים מעשיים – פתרון חמש בעיות עיקריות בפיתוח יישומי J2EE מורכבים. שרון דגן Senior Software IT Architect Software Group, IBM. J2EE - המספרים. שוק של 2.19 מיליארד דולר בשנת 2002 ( Source: Giga ) 31 חברות רכשו את רישיון J2EE 10 חברות מייצרות שרתי יישומים גרסאות קוד מקור פתוח זמינות

vaughn
Download Presentation

טיפים מעשיים – פתרון חמש בעיות עיקריות בפיתוח יישומי J2EE מורכבים

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. טיפים מעשיים – פתרון חמש בעיות עיקריות בפיתוח יישומי J2EE מורכבים שרון דגן Senior Software IT Architect Software Group, IBM

  2. J2EE - המספרים • שוק של 2.19 מיליארד דולר בשנת 2002 (Source: Giga) • 31 חברות רכשו את רישיון J2EE • 10 חברות מייצרות שרתי יישומים • גרסאות קוד מקור פתוח זמינות • 652 חברים ב- Java Community Process • 554 מחברות שונות • 98 עצמאיים

  3. Source: Gartner Group Nov 2002 1998 1999 2000 2001 2002 2003 2004 2005 2006 J2EE – המספרים (המשך) • הוגדרו עד כה 224 סטנדרטים • 60% בהובלה של חברות שונות מהתעשייה • 40% בהובלה של חברת Sun • הרוב המכריע של המערכות הגדולות מפותח ב- J2EE • מעל 500 משתמשים בו-זמנית

  4. החדשות הטובות • פלטפורמת J2EE מספקת תשתית מעולה לפיתוח יישומים – עוקר העוקץ מההתלבטות מה היא הארכיטקטורה "הנכונה" • "Single User, Single Thread" • מקנה יכולות של טרנזאקציונליות, אבטחת מידע וניהול ללא השקעה בפיתוח עצמי • קל לפתח יישומים בעלי יכולת גידול מצוינת - עוד מעבדים, עוד מכונות, פלטפורמות טובות יותר • אקולוגיה עשירה של תבניות עיצוב פלטפורמת J2EE הגיעה לנקודת ה – "80/20" – כלומר, ניתן לפתח 80% מהיישומים באמצעותה – בקלות יחסית

  5. 10%מהיישומים המפותחים בשוק המודל התיכנותי של J2EE אינו רחב מספיק עבור יישומים אלו - יש לפתח תשתית נוספת יישומים שאינם מתאימים בקלות למודל התיכנותי הנוכחי של J2EE • יישומים בעלי אופי נתונים ופעולות המשתנים בזמן ריצה • יישומים בעלי אופי "פעיל" לעומת "סביל" • יישומים אסינכרוניים מעיקרם (מבוססי זמן, אירועים) • אין פתרונות קסם - וגם השפנים של מיקרוסופט לא מספיקים ;-)

  6. מודל סטאטי מידי כי... • דגש על קלות פיתוח הצהרתית (Declarative) • Deployment Descriptors • אינו מאפשר הגדרה של תכונות הצהרתיות בזמן ריצה • Finder Methods של CMP Entity Beans • Destinations/Filters של Message-Driven Beans • Security Roles מודל פסיבי מידי כי... • מבוסס על קונספט של בקשה/תגובה (Request/Response) קצרה • RMI/IIOP/HTTP Request/Response • היישום מקבל פיקוח רק כתגובה לבקשה חיצונית כלשהי

  7. שיפורים אפשריים למודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security

  8. Finder Methods של CMP Entity Beans • מתודה ריקה המוגדרת ב– Home Interface של ה– Entity Bean. ממומשת באמצעות שאילתה של EJB-QL המוגדרת ב - DD • משמשת למציאת מופע (או מופעים) של ה- Entity Bean האתגרים • יש להגדיר את כל השאילתות מראש ובזמן הפיתוח • מה אם איננו יודעים מראש את כל הפרמוטציות של השאילתה? • SELECT OBJECT(e) FROM EmpBean e WHERE e.salary = ?1 • SELECT OBJECT(e) FROM EmpBean e WHERE e.salary > ?1 • SELECT OBJECT(e) FROM EmpBean e WHERE e.salary = ?1 AND e.car = ?2 • ...

  9. הפתרון הרצוי • Dynamic EJB Query Service • מאפשר הרכבת שאילתות בזמן ריצה המתייחסות ל – Entity Beans • בדומה ל – JDBC • משתמש ב – EJB-QL • מאפשר שימוש טבעי במודל מונחה-העצמים של היישום הקטנת המתח בין פיתוח מונחה עצמים לבין פיתוח מוכוון מסד-נתונים

  10. דוגמא 1 • מצא את העובדים להם משכורת מעל סכום מסוים ורכב חברה InitialContext ic = new InitialContext(); QueryHome qh = ( QueryHome ) ic.lookup( “java:comp/env/QueryBean” ); QueryLocal qs = qh.create(); String query = “SELECT OBJECT(e) FROM EmpBean e WHERE e.salary > ?1 AND e.car = ?2“; Object[] params = new Object[] { new Float( 10000 ), new Boolean( true ) }; IQueryTuple tuple = qs.execute( query, params );

  11. דוגמא 2 • מצא את העובדים בעלי רכב הגרים רחוק מהמשרד • ניווט ב – Relationships • הפעלת מתודה המוגדרת ב – Entity Bean Location distance( String ) Inherits Employee Address 1 1 homeAddress SELECT OBJECT(e) FROM EmpBean e WHERE e.car = ‘true’ AND e.homeAddress.distance( ’2 Weizmann, Tel Aviv’ ) > ?1

  12. דוגמא 3 • בחר שם ושם משפחה מרשימת כל העובדים • בחירה של יותר מאלמנט אחד מה- Entity Bean SELECT e.fname, e.lname FROM EmpBean e

  13. אלטרנטיבות • שימוש ב- BMP Entity Beans • מאפשר פתרון של בעיית הפרמוטציות • אינו מאפשר שימוש טבעי במודל מונחה-העצמים של היישום • BMPs אינם מומלצים בדרך כלל :-) • IBM WebSphere AS Enterprise • מימוש מוקדם של התקן הצפוי

  14. לסיכום • Dynamic EJB Query Service • תוספת דרושה ל – J2EE • מרחיב את המודל התיכנותי הנוכחי • מאפשר שימוש טבעי יותר במודל מונחה-עצמים של היישום • זמינות • צפוי ב – J2EE v1.5

  15. שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security

  16. Read-Mostly CMPs • Entity Beans הנקראים בתדירות גבוהה אך משתנים בתדירות נמוכה • דוגמא: קבוצת דיון הממומשת באמצעות CMPs האתגרים • איך לחסוך את הקריאות למסד הנתונים? • Read-Only Cache אינו מספיק טוב • הנתונים משתנים מידי פעם • איך לשמור על אמינות ונכונות (Integrity) המידע באשכול? • יש לסנכרן בין המופעים השונים של ה- Cache

  17. הפתרון הרצוי • Coherent Distributed Cache • אינו מפר את המודל התיכנותי של Entity Beans • מאפשר רמות שונות של Quality of Service (QoS) • אמינות נתונים הנשמרת במחיר של ביצועים טובים פחות

  18. מימוש • אפשרות לקבוע לכל CMP את זמן החיים ב- Cache • כשזמן זה פוקע ומתבצעת גישה ל- CMP זה, יקראו הנתונים מחדש • Cache Invalidation APIs • Read/Write-Through Cache • הנתונים נכתבים ונקראים 'דרך' ה- Cache • שינויים מופצים לכל המופעים של שרת היישומים בהם מוצב היישום הרלוונטי • Publish/Subscribe בדרגות שונות של חומרה • עד רמה של שימוש בפרוטוקול 2-Phase Commit

  19. 1 2 4 5 6 3 דוגמא למימוש Application Server Application Server CMP A Broker Cache Cache Broker A A B DB

  20. אלטרנטיבות • פיתוח עצמי מבוסס על Seppuku Pattern • רצוי Cache Invalidation API בשרת היישומים • אינו מעביר את השינויים שנעשו באובייקטים • נפוץ • מוצרים כמו TangSol Coherent • Clustered Hashtable • מפר את המודל התיכנותי, מחייב BMPs • ביצועים טובים • IBM WebSphere AS Enterprise • Cache • מימוש מוכן לשימוש של Seppuku Pattern • Clustered Hashtable

  21. לסיכום • Coherent Distributed Cache • חיוני כדי לשמור על יושר הנתונים באשכול • שומר על המודל התיכנותי • זמין חלקית • Quality of Service של שרתי יישומים

  22. שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security

  23. Message-Driven Bean • אובייקט המקבל פיקוח כאשר יש הודעה בתור • onMessage( Message m ) • מאפשר קביעת פילטרים שונים האתגרים • יש להגדיר מראש את התור לו מאזינים • תורים ניתן להגדיר בזמן ריצה אך לא MDBs • יש להגדיר מראש את הפילטר • במקרים רבים יש לשנות את הפילטר בזמן ריצה כתגובה לכמות המידע אותו מבקש המשתמש לקבל • במערכת רוויה, איך להפסיק זמנית עיבוד הודעות חדשות?

  24. הפתרון הרצוי • Dynamic Message-Driven Bean • מאפשר יצירה של MDBs חדשים בזמן ריצה • זה המוצב בשרת היישומים משמש כתבנית • מאפשר מחיקה של MDB • מאפשר Stop/Start דינאמי • מאפשר שינוי הפילטר

  25. אלטרנטיבות • פיתוח עצמי • מחייב תשתית Threads • לוגיקה עדינה בטיפול בשגיאות (Poisoned Messages) • קשה לממש פילטרים יעילים • נפוץ

  26. לסיכום • Dynamic Message-Driven Bean • תוספת דרושה ל- J2EE • מרחיב את המודל התיכנותי הנוכחי • לא זמין עדיין • צפוי ב- J2EE v1.5 • הדגש ב- J2EE v1.4 היה הפשטה נוספת של הקונספט • JCA-Driven Bean • שרשור סטאטי

  27. שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security

  28. Active Applications • יישומים בעלי מחזור-חיים המנותק ממודל הבקשה/תגובה האתגרים • היישום מקבל פיקוח רק בתגובה לאירוע חיצוני • איך להריץ עבודה יזומה באופן מקבילי? • שימוש ב- JMS מאפשר ניתוק אסינכרוני • ניצול לרעה • איך לתזמן עבודה המבוססת על אירועי זמן?

  29. דוגמא למודל הקיים • קריאה למתודה של EJB Application Server Request EJB Reply EJB Request EJB Reply

  30. הפתרון הרצוי • Asynchronous Container • למעשה Thread Pool מתוחכם • Threads מנוהלים על ידי שרת היישומים • Nanny • שומר על ה- J2EE Context בעבודה האסינכרונית • דוגמא: הרשאות המשתמש שהתחיל את העבודה

  31. דוגמא 1 • קריאה למתודה של EJB מתוך שרת היישומים עצמו Application Server Request Work Manager 1 EJB Reply EJB Request EJB Work Manager 2 Reply EJB

  32. דוגמא 2 • מסירה של עבודה ל- Container InitialContext ic = new InitialContext(); WorkManager wm = ( WorkManager ) ic.lookup( “java:comp/env/WorkManager” ); WorkHandle h = wm.start( new Work() { public void run() { // do something asynchronously here } } ); // do something useful with work handle

  33. דוגמא 3 • Dynamic Message Driven Bean InitialContext ic = new InitialContext(); WorkManager wm = ( WorkManager ) ic.lookup( “java:comp/env/WorkManager” ); WorkHandle h = wm.start( new Work() { public void run() { QueueConnectionFactory qcf = ... Queue q = ... ... while( !END-CONDITION ) Message m = q.readMessage(); mdb.onMessage( m ); } } } );

  34. דוגמא 4 • Scheduler, Calendar // Create a Calendar object representing the time 30 days from now Calendar time = Calendar.getInstance(); // the current time time.add( Calendar.DATE, 30 ); // add 30 days to the current time Date date = time.getTime(); // Create a timer that will go off 30 days from now EJBContext ejbContext = ... TimerService timerService = ejbContext.getTimerService(); timerService.createTimer( date, null ); // invoke ejbTimeout( Timer timer ) when timer goes off

  35. דוגמאות נוספות תגובה לאירועים פנימיים • Alarms – "קרא לי כל 10ms" • Events • עיבודי אצווה (Batch) • בניית Daemons • ה- Socket Server הקלאסי • בקשות חדשות נמסרות כ- Work ל- Container • בניה מקבילית של חלקים מדפי JSP ופורטלטים • IBM WebSphere Portal

  36. אלטרנטיבות • פיתוח עצמי • מחייב תשתית Threads • לא מאפשר לשמור על ה- J2EE Context במלואו • מתחרה בניהול המשאבים של שרת היישומים • מפר את המודל התיכנותי של J2EE • גרסאות פשוטות נפוצות • תזמון עבודות באמצעות מוצרים נוספים • Tivoli Workload Scheduler • מערכות הפעלה (cron) • IBM WebSphere AS Enterprise • מימוש מוקדם של התקן הצפוי

  37. לסיכום • Asynchronous Container • תוספת דרושה ל- J2EE • מרחיב את המודל התיכנותי הנוכחי • מאפשר מימוש פשוט של מגוון מערכות • זמינות • צפוי ב- J2EE v1.5 • אירועי זמן בסיסיים מוגדרים ב- EJB v2.1 • קונספט של Work ו- WorkManager מוגדר ב- JCA v1.5

  38. שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security

  39. Security • Role-based Security • תפקידים מוגדרים בזמן פיתוח • קובעים אילו פעולות מותר/אסור לתפקיד מסוים לבצע אתגרים • יש להגדיר מראש את כל התפקידים • מה אם אין מיפוי ברור בין תפקיד לבין היישום? • דוגמא: ללקוחות שונים מבנה ארגוני שונה • מה אם ההרשאות מבוססות מופע מסוים של הנתונים?

  40. דוגמא 1 למודל הקיים Run As Caller • מערכת הזמנות • הוגדרו שני תפקידים • מחסנאי: read • איש מכירות: read, write, delete • ללקוח חדש יש תפקיד נוסף • מחסנאי בכיר: read, delete Façade read write delete JSP CMP CMP CMP CMP

  41. דוגמא 2 למודל הקיים • מערכת הזמנות • רק מחסנאי בכיר יכול לטפל בהזמנות של מעל ל- $1000 • מחייב ערבוב קוד של לוגיקה עסקית והרשאות // somewhere in the read() method ... if( order.getTotal() > 1000 && ejbContext.isCallerInRole( “SeniorWarehouseOperator” ) { // do something } else throw new SomeSecurityException()

  42. הפתרון הרצוי • Dynamic Security • יכולת ליצור, למחוק ולשנות Security Roles והרשאות בזמן ריצה • מחייב Bind ל- User Registry • מחייב Provisioning APIs • Security Callback • בהחלטות על הרשאות • בדומה ל- JAAS Login Module • החצנה של מנגנון ההרשאות וביסוסו על מנוע חוקים

  43. דוגמא • Security Callback • יש לכתוב קוד יעיל ביותר class OrderCallback extends EntityBeanSecurityCallback { public int checkPermission( Principle p, OrderBeanLocal b ) { if( b.getTotal() > 1000 && p.isInRole( “SeniorWarehouseOperator” ) return OK; else return SECURITY_ERROR; } }

  44. אלטרנטיבות • הרשאות מבוססות על מופע מסוים • קל יחסית לפתור את הבעיות הפשוטות • נפוץ • IBM WebSphere AS Enterprise • מימוש מוקדם של JavaACC • מימוש מוקדם של Java Provisioning API • מימוש מוקדם של Java Rule Engine API

  45. לסיכום • Dynamic Security • תוספת דרושה ל- J2EE • מרחיב את המודל התיכנותי הנוכחי • לא זמין עדיין • JavaACC הוגדר ב- J2EE v1.4 • Java Provisioning API בתהליך תקינה • Java Rule Engine API בתחילת תהליך התקינה • מחייב פיתוח עצמי • אתגר רציני

  46. Lorem ipsum הנקודות העיקריות שכדאי לזכור ממצגת זו • 80/20 היום משמעו 90/10 מחר :-) • אל תמציאו את הגלגל מחדש • IBM WebSphere AS Enterprise • מימוש מוקדם של התקנים הצפויים

  47. תודה! • מצגות נוספות המומלצות לארכיטקטים • מצגת 3C - טכנולוגיית Web Services • מצגת 6C - J2EE פוגש ב- Workflow • מצגת D6 - אבטחת יישומי J2EE

  48. אנא מלאו את טופס המשוב A1 קוד ההרצאה:

More Related