การคำนวณเวลาจริงคืออะไร?
โปรดดูภาพด้านล่าง:
ใช้สถิติของผลิตภัณฑ์ร้อนเป็นตัวอย่างเพื่อดูวิธีการคำนวณแบบดั้งเดิม:
1 บันทึกพฤติกรรมผู้ใช้บันทึกและข้อมูลอื่น ๆ ในฐานข้อมูล
2 บันทึกข้อมูลการสั่งซื้อในฐานข้อมูล
3 ใช้ทริกเกอร์หรือ coroutine เพื่อสร้างดัชนีท้องถิ่นหรือดัชนีอิสระระยะไกล
ข้อมูลการสั่งซื้อ 4Join รายละเอียดการสั่งซื้อข้อมูลผู้ใช้ข้อมูลผลิตภัณฑ์ ฯลฯ รวมผลิตภัณฑ์ภายใน 20 นาทีและกลับไปที่ 10 อันดับแรก
5web หรือแอพแสดงผล
นี่เป็นฉากจินตนาการ แต่สมมติว่าคุณมีประสบการณ์ในการจัดการกับฉากที่คล้ายกันคุณควรประสบปัญหาและปัญหาดังกล่าว:
1. ปัญหาการขยายตัวในแนวนอน (ขนาดออก)
เห็นได้ชัดว่าถ้าเป็นเว็บไซต์ e -commerce ที่มีสเกลที่แน่นอนจำนวนข้อมูลมีขนาดใหญ่มาก เนื่องจากข้อมูลการทำธุรกรรมเกี่ยวข้องกับการทำธุรกรรมจึงเป็นการยากที่จะละทิ้งความสามารถในการทำธุรกรรมของฐานข้อมูลความสัมพันธ์โดยตรงและโยกย้ายไปยังฐานข้อมูล NOSQL ที่มีความสามารถในการขยายขนาดที่ดีขึ้น
โดยทั่วไปแล้วจะทำ โชคดีที่เราสามารถเก็บถาวรตามวันที่และแคชผลลัพธ์โดยการประมวลผลแบทช์การคำนวณแบบออฟไลน์
อย่างไรก็ตามข้อกำหนดที่นี่คือภายใน 20 นาทีซึ่งเป็นเรื่องยาก
2. ปัญหาประสิทธิภาพ <br /> ปัญหานี้สอดคล้องกับการขยายขนาด
คำถามคือเราต้องเข้าคลังสินค้ากี่ครั้ง?
ประมาณ 10 นาที?
ประมาณ 5 นาที?
แล้วเรียลไทม์ล่ะ?
นอกจากนี้เลเยอร์ธุรกิจยังต้องเผชิญกับข้อ จำกัด ของพลังการคำนวณจุดเดียวและต้องมีการขยายตัวในแนวนอนดังนั้นจึงจำเป็นต้องพิจารณาปัญหาของความสอดคล้อง
ดังนั้นทุกอย่างซับซ้อนมากที่นี่
3. ปัญหาการขยายธุรกิจ <br /> สมมติว่าเราไม่เพียง แต่จัดการกับสถิติของสินค้าขายร้อน แต่ยังคลิกโฆษณาทางสถิติหรือกำหนดลักษณะของผู้ใช้อย่างรวดเร็วตามพฤติกรรมการเข้าถึงของผู้ใช้เพื่อปรับข้อมูลที่พวกเขาเห็นธุรกิจ เลเยอร์จะซับซ้อนมากขึ้น
บางทีคุณอาจมีวิธีที่ดีกว่า แต่ที่จริงแล้วสิ่งที่เราต้องการคือความรู้ความเข้าใจใหม่:
สิ่งที่เกิดขึ้นในโลกนี้เป็นเวลาจริง
ดังนั้นเราจึงต้องมีแบบจำลองที่คำนวณแบบเรียลไทม์ไม่ใช่แบบจำลองการประมวลผลแบบแบทช์
รุ่นนี้เราต้องสามารถประมวลผลข้อมูลได้มากดังนั้นจึงเป็นการดีที่สุดที่จะมีความสามารถในการขยายขนาดที่ดี
จากนั้นรูปแบบการคำนวณนี้เป็นรูปแบบการคำนวณเวลาจริงซึ่งสามารถถือได้ว่าเป็นรูปแบบการสตรีมการสตรีม
ตอนนี้สมมติว่าเรามีรูปแบบดังกล่าวเราสามารถออกแบบสถานการณ์ธุรกิจใหม่ ๆ ได้อย่างมีความสุข:
Weibo ที่ส่งต่อมากที่สุดคืออะไร?
ผลิตภัณฑ์ที่ร้อนแรงที่สุดคืออะไร?
จุดร้อนที่ทุกคนกำลังค้นหาคืออะไร?
โฆษณาใดตำแหน่งใดที่คลิกมากที่สุด?
หรือเราสามารถถาม:
เกิดอะไรขึ้นในโลกนี้?
หัวข้อ Weibo ที่ร้อนแรงที่สุดคืออะไร?
เราใช้จำนวนหน้าต่างบานเลื่อนแบบง่าย ๆ เพื่อเปิดเผยม่านลึกลับของการคำนวณเวลาจริงที่เรียกว่า
สมมติว่าข้อกำหนดทางธุรกิจของเราคือ:
สถิติ 10 หัวข้อ Weibo ที่ร้อนแรงที่สุดใน 20 นาที
เพื่อแก้ปัญหานี้เราต้องพิจารณา:
1. แหล่งข้อมูล <br /> ที่นี่สมมติว่าข้อมูลของเราหัวข้อจาก Weibo Long Connection Push
2. การสร้างแบบจำลองปัญหา
หัวข้อที่เราคิดว่าเป็นการขยายตัวของหมายเลข#
ตัวอย่างเช่น: @foreach_break: สวัสดี#比#ฉันรักคุณ#weibo#
"World" และ "Weibo" เป็นหัวข้อ
3. การคำนวณเครื่องยนต์
เราใช้พายุ
4. กำหนดเวลา
จะกำหนดเวลาได้อย่างไร?
คำจำกัดความของเวลาเป็นสิ่งที่ยากขึ้นอยู่กับความแม่นยำที่จำเป็น
ตามความเป็นจริงเรามักจะใช้เห็บเพื่อเป็นตัวแทนของแนวคิดนี้
ในโครงสร้างพื้นฐานของ Storm ขั้นตอนการเริ่มต้นของผู้ดำเนินการใช้ตัวจับเวลาเพื่อกระตุ้นเหตุการณ์ "หลังจากระยะเวลาหนึ่ง"
ดังที่แสดงด้านล่าง:
(การตั้งค่า defn-ticks! : component-id executor-data)))) Alse (Storm-Conf Topology-enable-message-timeouts) (=: spout (: ประเภท Executor-Data))) (บันทึกการทำงาน "ปิดใช้งาน" id exec utor-data) ":" ("(" ("(: Executor-ID Executor-Data) (การจัดทำตารางเวลา (: ผู้ใช้งานผู้ใช้งาน) TICK-TIME-SECS Secs Time-Time-Secs (FN [] (disruptor/ เผยแพร่รับ-คิว [[nil (tupleimpl. บริบท [tick -time-secs] ค่าคงที่/system_task_id ค่าคงที่/system_tick_stream_id)))))))))))))))))))))))))))))))))))))))ทุกครั้งที่เหตุการณ์ดังกล่าวจะถูกทริกเกอร์
Bolt ตัดสินอย่างไรว่า tuple ที่ได้รับหมายถึง "เห็บ"?
รับผิดชอบในการจัดการเธรดผู้บริหารของ Bolt
Public Static Boolean Isstick (Tuple Tuple) {return tuple! เมื่อรวมกับรหัส Clojure ของการตั้งค่า Tick!
จะเห็นได้ว่าในรหัสต่อไปนี้ system_task_id ก็ผ่านไปยัง tuple:
-
(tupleimpl. บริบท [tick-time-secs] ค่าคงที่/system_task_id ค่าคงที่/system_tick_stream_id)))
จากนั้นใช้รหัสต่อไปนี้เพื่อรับ system_component_id:
Public String getComponentId (int taskId) {ถ้า (taskId == ค่าคงที่ SYSTEM_ID_ID) {return constants.System_Component_id;ด้วย โครงสร้างพื้นฐาน ด้านบน <br /> เรายังต้องการวิธีการบางอย่างในการทำ "วิศวกรรม" ให้สมบูรณ์และเปลี่ยนความคิดให้เป็นจริง
ที่นี่มาดูการออกแบบหน้าต่างบานเลื่อนของ Michael G. Noll
ทอพอโลยี
String Spoutid = "WordGenRator"; / หน้าต่างเวลาของ RollingCountbolt คือ 9 วินาทีและผลลัพธ์ทางสถิติจะถูกส่งทุก ๆ 3 วินาทีไปยังผู้สร้างปลายน้ำ Setbolt (Countrid, RollingCountbolt ใหม่ (9, 3), 4) .FieldSgrouping (spoutid, IELDS ใหม่ ( ; เสร็จสิ้นการรวมตัวที่สมบูรณ์และนับ Builder Top-N Topic Builder.setbolt (TotalRankerID, TotalRankingSbolt ใหม่ (TOP_N))
การออกแบบด้านบนด้านบนมีดังนี้:
รวมการคำนวณการรวมเข้ากับเวลา
ก่อนหน้านี้เราอธิบายเหตุการณ์เห็บซึ่งจะกระตุ้นวิธีการดำเนินการของ Bolt ในระหว่างการโทรกลับซึ่งสามารถทำได้:
RollingCountbolt:
@Override โมฆะสาธารณะ Execute (Tuple Tuple) {ถ้า (tpleutils.istick (tuple)) {log.debug ("ได้รับ taple tuple, triggey ปล่อยออกมาจาก windows ปัจจุบัน"); ส่งมันและปล่อยให้หน้าต่างเลื่อน emitcurrentWindowCounts ();} else {// tuple ทั่วไปและการนับหัวข้อสามารถนับได้ (tuple);} // obj เป็นหัวข้อเพิ่มการนับ ++ // ให้ความสนใจความเร็วที่นี่ โดยพื้นฐานแล้วเป็นพื้นฐานที่นี่ Bolt สามารถขยายออกไปได้ EmitCurrentWindowCounts () {MAP <Object, Long> Counts = CountCountSthenAdvanceWindow (); (window_lengtt h_warning_template , realWindowLengthInseconds, windowlengthinseconds);} emit (counts, realwindowlengthinseconds);}รหัสด้านบนอาจเป็นนามธรรมเล็กน้อย
Intermediankingsbolt & Totalrankingsbolt:
Public Void Execute (Tuple Tuple, BasicOutputCollector Collector) {ถ้า (tupleutils.istick (tuple)) {getLogger () ;} else {// polytes และจัดเรียง UpdaterAnkingswithtuple (tuple);}}ในหมู่พวกเขาวิธีการเรียงลำดับโดยรวมของอินเทอร์เน็ตและ Totalrankingsbolt นั้นแตกต่างกันเล็กน้อย:
Intermediatorankingsbolt วิธีการเรียงลำดับโดยรวม:
// intermediatorankingsbolt วิธีการเรียงลำดับโดยรวม: @Override เป็นโมฆะ updateAnkingswithtuple (tuple tuple) {// ขั้นตอนนี้คือการแยกจำนวนหัวข้อและหัวข้อ เวลารวมกันแล้วหัวข้อทั้งหมด shaper.getrankings ()วิธีการเรียงลำดับโดยรวมของ TotalRankingSbolt:
// วิธีการเรียงลำดับรวมของ TotalRankingsbolt @Override เป็นโมฆะ updaterankingswithtuple (tple tuple) {// เสนอผลลัพธ์กลางของผลลัพธ์กลางของอินเทอร์เน็ตกลาง ()วิธีการเรียงลำดับหนักนั้นค่อนข้างง่ายและหยาบคายเพราะมีเพียง N, N เท่านั้นที่จะไม่ใหญ่มาก:
Private Void () {Collects.sort (RankEdItems); บทสรุป
รูปด้านล่างอาจเป็นผลลัพธ์ที่เราต้องการ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้