480 likes | 633 Views
×˜×™×¤×™× ×ž×¢×©×™×™× â€“ פתרון חמש בעיות עיקריות בפיתוח יישומי J2EE מורכבי×. שרון דגן Senior Software IT Architect Software Group, IBM. J2EE - המספרי×. שוק של 2.19 מילי×רד דולר ×‘×©× ×ª 2002 ( Source: Giga ) 31 חברות רכשו ×ת רישיון J2EE 10 חברות מייצרות שרתי ×™×™×©×•×ž×™× ×’×¨×¡×ות קוד מקור פתוח ×–×ž×™× ×•×ª
E N D
טיפים מעשיים – פתרון חמש בעיות עיקריות בפיתוח יישומי J2EE מורכבים שרון דגן Senior Software IT Architect Software Group, IBM
J2EE - המספרים • שוק של 2.19 מיליארד דולר בשנת 2002 (Source: Giga) • 31 חברות רכשו את רישיון J2EE • 10 חברות מייצרות שרתי יישומים • גרסאות קוד מקור פתוח זמינות • 652 חברים ב- Java Community Process • 554 מחברות שונות • 98 עצמאיים
Source: Gartner Group Nov 2002 1998 1999 2000 2001 2002 2003 2004 2005 2006 J2EE – המספרים (המשך) • הוגדרו עד כה 224 סטנדרטים • 60% בהובלה של חברות שונות מהתעשייה • 40% בהובלה של חברת Sun • הרוב המכריע של המערכות הגדולות מפותח ב- J2EE • מעל 500 משתמשים בו-זמנית
החדשות הטובות • פלטפורמת J2EE מספקת תשתית מעולה לפיתוח יישומים – עוקר העוקץ מההתלבטות מה היא הארכיטקטורה "הנכונה" • "Single User, Single Thread" • מקנה יכולות של טרנזאקציונליות, אבטחת מידע וניהול ללא השקעה בפיתוח עצמי • קל לפתח יישומים בעלי יכולת גידול מצוינת - עוד מעבדים, עוד מכונות, פלטפורמות טובות יותר • אקולוגיה עשירה של תבניות עיצוב פלטפורמת J2EE הגיעה לנקודת ה – "80/20" – כלומר, ניתן לפתח 80% מהיישומים באמצעותה – בקלות יחסית
10%מהיישומים המפותחים בשוק המודל התיכנותי של J2EE אינו רחב מספיק עבור יישומים אלו - יש לפתח תשתית נוספת יישומים שאינם מתאימים בקלות למודל התיכנותי הנוכחי של J2EE • יישומים בעלי אופי נתונים ופעולות המשתנים בזמן ריצה • יישומים בעלי אופי "פעיל" לעומת "סביל" • יישומים אסינכרוניים מעיקרם (מבוססי זמן, אירועים) • אין פתרונות קסם - וגם השפנים של מיקרוסופט לא מספיקים ;-)
מודל סטאטי מידי כי... • דגש על קלות פיתוח הצהרתית (Declarative) • Deployment Descriptors • אינו מאפשר הגדרה של תכונות הצהרתיות בזמן ריצה • Finder Methods של CMP Entity Beans • Destinations/Filters של Message-Driven Beans • Security Roles מודל פסיבי מידי כי... • מבוסס על קונספט של בקשה/תגובה (Request/Response) קצרה • RMI/IIOP/HTTP Request/Response • היישום מקבל פיקוח רק כתגובה לבקשה חיצונית כלשהי
שיפורים אפשריים למודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security
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 • ...
הפתרון הרצוי • Dynamic EJB Query Service • מאפשר הרכבת שאילתות בזמן ריצה המתייחסות ל – Entity Beans • בדומה ל – JDBC • משתמש ב – EJB-QL • מאפשר שימוש טבעי במודל מונחה-העצמים של היישום הקטנת המתח בין פיתוח מונחה עצמים לבין פיתוח מוכוון מסד-נתונים
דוגמא 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 );
דוגמא 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
דוגמא 3 • בחר שם ושם משפחה מרשימת כל העובדים • בחירה של יותר מאלמנט אחד מה- Entity Bean SELECT e.fname, e.lname FROM EmpBean e
אלטרנטיבות • שימוש ב- BMP Entity Beans • מאפשר פתרון של בעיית הפרמוטציות • אינו מאפשר שימוש טבעי במודל מונחה-העצמים של היישום • BMPs אינם מומלצים בדרך כלל :-) • IBM WebSphere AS Enterprise • מימוש מוקדם של התקן הצפוי
לסיכום • Dynamic EJB Query Service • תוספת דרושה ל – J2EE • מרחיב את המודל התיכנותי הנוכחי • מאפשר שימוש טבעי יותר במודל מונחה-עצמים של היישום • זמינות • צפוי ב – J2EE v1.5
שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security
Read-Mostly CMPs • Entity Beans הנקראים בתדירות גבוהה אך משתנים בתדירות נמוכה • דוגמא: קבוצת דיון הממומשת באמצעות CMPs האתגרים • איך לחסוך את הקריאות למסד הנתונים? • Read-Only Cache אינו מספיק טוב • הנתונים משתנים מידי פעם • איך לשמור על אמינות ונכונות (Integrity) המידע באשכול? • יש לסנכרן בין המופעים השונים של ה- Cache
הפתרון הרצוי • Coherent Distributed Cache • אינו מפר את המודל התיכנותי של Entity Beans • מאפשר רמות שונות של Quality of Service (QoS) • אמינות נתונים הנשמרת במחיר של ביצועים טובים פחות
מימוש • אפשרות לקבוע לכל CMP את זמן החיים ב- Cache • כשזמן זה פוקע ומתבצעת גישה ל- CMP זה, יקראו הנתונים מחדש • Cache Invalidation APIs • Read/Write-Through Cache • הנתונים נכתבים ונקראים 'דרך' ה- Cache • שינויים מופצים לכל המופעים של שרת היישומים בהם מוצב היישום הרלוונטי • Publish/Subscribe בדרגות שונות של חומרה • עד רמה של שימוש בפרוטוקול 2-Phase Commit
1 2 4 5 6 3 דוגמא למימוש Application Server Application Server CMP A Broker Cache Cache Broker A A B DB
אלטרנטיבות • פיתוח עצמי מבוסס על Seppuku Pattern • רצוי Cache Invalidation API בשרת היישומים • אינו מעביר את השינויים שנעשו באובייקטים • נפוץ • מוצרים כמו TangSol Coherent • Clustered Hashtable • מפר את המודל התיכנותי, מחייב BMPs • ביצועים טובים • IBM WebSphere AS Enterprise • Cache • מימוש מוכן לשימוש של Seppuku Pattern • Clustered Hashtable
לסיכום • Coherent Distributed Cache • חיוני כדי לשמור על יושר הנתונים באשכול • שומר על המודל התיכנותי • זמין חלקית • Quality of Service של שרתי יישומים
שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security
Message-Driven Bean • אובייקט המקבל פיקוח כאשר יש הודעה בתור • onMessage( Message m ) • מאפשר קביעת פילטרים שונים האתגרים • יש להגדיר מראש את התור לו מאזינים • תורים ניתן להגדיר בזמן ריצה אך לא MDBs • יש להגדיר מראש את הפילטר • במקרים רבים יש לשנות את הפילטר בזמן ריצה כתגובה לכמות המידע אותו מבקש המשתמש לקבל • במערכת רוויה, איך להפסיק זמנית עיבוד הודעות חדשות?
הפתרון הרצוי • Dynamic Message-Driven Bean • מאפשר יצירה של MDBs חדשים בזמן ריצה • זה המוצב בשרת היישומים משמש כתבנית • מאפשר מחיקה של MDB • מאפשר Stop/Start דינאמי • מאפשר שינוי הפילטר
אלטרנטיבות • פיתוח עצמי • מחייב תשתית Threads • לוגיקה עדינה בטיפול בשגיאות (Poisoned Messages) • קשה לממש פילטרים יעילים • נפוץ
לסיכום • Dynamic Message-Driven Bean • תוספת דרושה ל- J2EE • מרחיב את המודל התיכנותי הנוכחי • לא זמין עדיין • צפוי ב- J2EE v1.5 • הדגש ב- J2EE v1.4 היה הפשטה נוספת של הקונספט • JCA-Driven Bean • שרשור סטאטי
שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security
Active Applications • יישומים בעלי מחזור-חיים המנותק ממודל הבקשה/תגובה האתגרים • היישום מקבל פיקוח רק בתגובה לאירוע חיצוני • איך להריץ עבודה יזומה באופן מקבילי? • שימוש ב- JMS מאפשר ניתוק אסינכרוני • ניצול לרעה • איך לתזמן עבודה המבוססת על אירועי זמן?
דוגמא למודל הקיים • קריאה למתודה של EJB Application Server Request EJB Reply EJB Request EJB Reply
הפתרון הרצוי • Asynchronous Container • למעשה Thread Pool מתוחכם • Threads מנוהלים על ידי שרת היישומים • Nanny • שומר על ה- J2EE Context בעבודה האסינכרונית • דוגמא: הרשאות המשתמש שהתחיל את העבודה
דוגמא 1 • קריאה למתודה של EJB מתוך שרת היישומים עצמו Application Server Request Work Manager 1 EJB Reply EJB Request EJB Work Manager 2 Reply EJB
דוגמא 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
דוגמא 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 ); } } } );
דוגמא 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
דוגמאות נוספות תגובה לאירועים פנימיים • Alarms – "קרא לי כל 10ms" • Events • עיבודי אצווה (Batch) • בניית Daemons • ה- Socket Server הקלאסי • בקשות חדשות נמסרות כ- Work ל- Container • בניה מקבילית של חלקים מדפי JSP ופורטלטים • IBM WebSphere Portal
אלטרנטיבות • פיתוח עצמי • מחייב תשתית Threads • לא מאפשר לשמור על ה- J2EE Context במלואו • מתחרה בניהול המשאבים של שרת היישומים • מפר את המודל התיכנותי של J2EE • גרסאות פשוטות נפוצות • תזמון עבודות באמצעות מוצרים נוספים • Tivoli Workload Scheduler • מערכות הפעלה (cron) • IBM WebSphere AS Enterprise • מימוש מוקדם של התקן הצפוי
לסיכום • Asynchronous Container • תוספת דרושה ל- J2EE • מרחיב את המודל התיכנותי הנוכחי • מאפשר מימוש פשוט של מגוון מערכות • זמינות • צפוי ב- J2EE v1.5 • אירועי זמן בסיסיים מוגדרים ב- EJB v2.1 • קונספט של Work ו- WorkManager מוגדר ב- JCA v1.5
שיפורים אפשריים במודל הנוכחי • CMP Entity Beans Finder Methods • Read-Mostly CMPs • Message-Driven Beans • Active Applications • Security
Security • Role-based Security • תפקידים מוגדרים בזמן פיתוח • קובעים אילו פעולות מותר/אסור לתפקיד מסוים לבצע אתגרים • יש להגדיר מראש את כל התפקידים • מה אם אין מיפוי ברור בין תפקיד לבין היישום? • דוגמא: ללקוחות שונים מבנה ארגוני שונה • מה אם ההרשאות מבוססות מופע מסוים של הנתונים?
דוגמא 1 למודל הקיים Run As Caller • מערכת הזמנות • הוגדרו שני תפקידים • מחסנאי: read • איש מכירות: read, write, delete • ללקוח חדש יש תפקיד נוסף • מחסנאי בכיר: read, delete Façade read write delete JSP CMP CMP CMP CMP
דוגמא 2 למודל הקיים • מערכת הזמנות • רק מחסנאי בכיר יכול לטפל בהזמנות של מעל ל- $1000 • מחייב ערבוב קוד של לוגיקה עסקית והרשאות // somewhere in the read() method ... if( order.getTotal() > 1000 && ejbContext.isCallerInRole( “SeniorWarehouseOperator” ) { // do something } else throw new SomeSecurityException()
הפתרון הרצוי • Dynamic Security • יכולת ליצור, למחוק ולשנות Security Roles והרשאות בזמן ריצה • מחייב Bind ל- User Registry • מחייב Provisioning APIs • Security Callback • בהחלטות על הרשאות • בדומה ל- JAAS Login Module • החצנה של מנגנון ההרשאות וביסוסו על מנוע חוקים
דוגמא • 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; } }
אלטרנטיבות • הרשאות מבוססות על מופע מסוים • קל יחסית לפתור את הבעיות הפשוטות • נפוץ • IBM WebSphere AS Enterprise • מימוש מוקדם של JavaACC • מימוש מוקדם של Java Provisioning API • מימוש מוקדם של Java Rule Engine API
לסיכום • Dynamic Security • תוספת דרושה ל- J2EE • מרחיב את המודל התיכנותי הנוכחי • לא זמין עדיין • JavaACC הוגדר ב- J2EE v1.4 • Java Provisioning API בתהליך תקינה • Java Rule Engine API בתחילת תהליך התקינה • מחייב פיתוח עצמי • אתגר רציני
Lorem ipsum הנקודות העיקריות שכדאי לזכור ממצגת זו • 80/20 היום משמעו 90/10 מחר :-) • אל תמציאו את הגלגל מחדש • IBM WebSphere AS Enterprise • מימוש מוקדם של התקנים הצפויים
תודה! • מצגות נוספות המומלצות לארכיטקטים • מצגת 3C - טכנולוגיית Web Services • מצגת 6C - J2EE פוגש ב- Workflow • מצגת D6 - אבטחת יישומי J2EE
אנא מלאו את טופס המשוב A1 קוד ההרצאה: