Sunday, September 25, 2011

Web Services นั้นมันเชื่อมกันไม่ได้ทุกอย่างหรอกนะ

    วันก่อน เจอ ปัญหาเกี่ยวกับ Web Services ที่ Site ลูกค้าเจ้าหนึ่ง เล่นเอาหมดแรงเลย
ทีเดียวแถมยังแก้ปัญหาไม่ได้ด้วย ปัญหาเกิดขึ้นเมื่อลูกค้ามีการ Develop application ตัวใหม่
แล้วต้องเชื่อมต่อกับ legacy ที่ บ. ผมทำไว้ซึ่งของเดิมมีการเชื่อมต่อแบบ Web Services
อยู่แล้ว ลูกค้าและทีมที่ทำเลยคิดว่าไม่มีปัญหา แต่แล้วเหตการมันกลับไม่เป็นแบบนั้น เพราะ...

    ของเดิมที่เคยเรียใช้กันได้นั้น ทีมที่ทำใช้วิธี สร้าง stub จาก wdsl link ที่อีก party ให้มา
โดยใช้ tools ตัวหนึ่งในการ generate stub แล้วทำการ pack .jar file ไปให้ tools ที่ใช้
develop legacy เรียกใช้อีกต่อหนึ่ง ฟังแล้วดูยุ่งยากพิลึก แต่เป็นทางเดียวที่ทำได้ เพราะ
tools ที่ใช้ develop legacy นั้นเรียก Web Services ตรงๆไม่ได้แต่สามารถเรียกใช้ java
ได้ ทางทีมรวมถึงลูกค้าและ Party ที่ทำ Web Services จึงคิดว่าไม่มีปัญหา เลยทำการ
estimate , plan , develop กันตามปกติแต่แล้วปัญหาก็็บังเกิดเมื่อจะเอามา integration
รวมกัน

    เนื่องจาก wsdl link ที่ provide มาให้นั้นเป็น HTTP ธรรมดาและ input ที่ stub
generate มาให้นั้นเป็น primitive type เช่น string , int ตามปกติ และ Output ก็เป็น
Class ปกติ ซึ่ง Tools ที่ใช้ Generate  Stub นั้นสามารถทำงานได้ แต่ ตัวที่พัฒนาปัจจุบัน
เปลี่ยน protocol เป็น https และ wsdl ที่ให้มาเป็นแบบ multi schema ที่มีการอ้างอิงไปยัง
schema อื่นๆ ซึ่งปัญหาข้อแรกจึงบังเกิดขึ้นทันที

1. Tools ที่ใช้อยู่ปัจจุบันไม่สามารถเรียก wsdl ที่เป็น link แบบ https ได้

การแก้ปัญหา คือ party ที่สร้างก็ได้ extract file WSDL และ XSD ที่ีถูกอ้างถึงมาให้ทั้งหมด
จึงพบปัญหาในขั้นถัดไป

2. Tools ที่ให้อยุ่ปัจจุบันไม่สามารถ Generate Stub จาก WSDL ที่เป็น Multiple Schema
  ได้

การแก้ปัญหา คือ ใช้ tools ชนิดเดียวกันแต่ version ใหม่กว่ามาทำการ Generate stub
ผลคือสามารถ generate stub ได้และ pack .jar file ได้แต่ก็พบกับปัญหาต่อมา

3. stub ที่สร้างออกมานั้นเป็น java code version 1.6 ซึ่งไม่ compatible กับ Tools ที่ใช้
Develop Legacy ที่ี support java แค่ version 1.4

การแก้ปัญหา คือ ทดลองใช้ tools อื่น ในการสร้าง stub ให้เป็น java version 1.4 ที่
tools develop legacy สามารถใช้งานได้ แต่ก็พบกับปัญหาถัดมา

4. Stub ที่ถูก Generate ออกมานั้น เป็น java code version 1.4 จริงแต่เรียงใ้ช้ library
บางตัวของ version 1.6 ทำให้ไม่สามารถเรียกใช้ได้

การแก้ปัญหา คือ กลับไปยังจุดเริ่มต้น โดยการแก้ไข WSDL ให้เป็น file เดียวโดยไม่ต้อง
อ้างอิง XSD อื่นๆ ทำให้ tools ตัว Generate ดั้งเดิมสามารถ Generate Stub ได้แต่ยัง
เวรกรรมยังไม่หมดแค่นั้น หลังจาก Generate Stub ได้แล้วทดสอบ java class ไม่สามารถ
เรียก Web Services ผ่าน HTTPS ได้ Autherization Fail โดยทีมได้พยายามหาเอกสาร
API ของ tools มาใช้แต่รายละเอีดน้อยมาก Follow ตามเอกสารแล้วไม่ประสพความสำเร็จ


  สุดท้ายจึง mail แจ้งไปยัง เจ้าของ tools ที่ใช้ว่ากรณีแบบนี้เราต้องทำอย่างไร แล้วรอคำ
ตอบ จากการพยายามหาวิธีเป็นเวลากว่า 10 ชั่วโมง โดยทางทีม , ลูกค้า และ party อื่น
ซึ่งโดยส่วนตัวแล้ว วิธีแก้ปัญหานี้จะง่ายมาก หาก ให้ legacy สามารถ access database
ของระบบใหม่ได้โดยผ่าน database link requirement นี้จะเรียบร้อยภายในเวลาไม่กี่ชั่วโมง
แต่เนื่องจาก Policy ของลูกค้าอาจจะทำอย่างนั้นไม่ได้ จึงเกิด solution ที่ต้องไปเรียก Web
Services ผ่าน ESB แทนซึ่งไม่มีัใครคาดคิดประเด็นทางด้าน Technic มาก่อน

ประเด็นที่ต้องพิจารณาของการทำงานครั้งนี้คือ

1. การเปลี่ยน interface ของ Web Service จากเดิม HTTP Simple type เป็น HTTPS
Complex Type แบบ Multiple Schema โดยไม่มีการทำ Prove Of Concept เสียก่อน

2. ระบบ ที่เชื่มต่อกันมีรอยห่างของ technology มากเกินไป การที่ Java Version ต่างกันนั้น
สามารถสร้างปัญหาได้ หาก tools ที่ใช้ ไม่สามารถเปลี่ยนแปลง Version ของ java ให้ทัน
ตามกันไปได้

3. การแก้ปัญหาของ Process สามารถแก้ได้โดย Technical และ การแก้ปัญหา Technical
ก็สามารถแก้ได้โดย Business Process เช่นกัน