- 27
- 22 433
BigBird Config
เข้าร่วมเมื่อ 24 ก.ย. 2022
Thai developer coding for a living.
บางครั้งการส่งผ่าน function ก็ใช้งานได้ดีกว่าการส่งผ่าน object
ตัวอย่างสั้นๆ ด้วยภาษา scala ในการแสดงให้เห็นว่า บางครั้งการส่งผ่าน function ก็ใช้งานได้ดีกว่าการส่งผ่าน object
มุมมอง: 330
วีดีโอ
กำจัด Thread.sleep ออกจาก Java unit test
มุมมอง 1.8Kวันที่ผ่านมา
การใช้ Thread.sleep() ใน unit test มักจะทำให้ test ใช้เวลาประมวลผลนานเกินความจำเป็น และยังทำให้ผลการทำงานไม่แน่นอน บางครั้งผ่าน บางครั้งไม่ผ่าน อยากจะเสนอแนะวิธีกำจัดมันออกไปจาก unit test
เรียนรู้การใช้ HAProxy ร่วมกับ Consistent Hashing
มุมมอง 4.5K21 วันที่ผ่านมา
โปรแกรมเมอร์ backend คงจะคุ้มเคยกันดีกับ HAProxy ซี่งเป็น load balancer ที่ได้รับความนิยมเป็นอย่างมาก วิดีโอนี้ผมได้ลองใช้ HAProxy ร่วมกับ Consistent Hashing จำลองการกระจาย load ใน distributed system.
Object ที่ไม่เป็นมิตรในการใช้งานสักเท่าไหร่นัก
มุมมอง 24321 วันที่ผ่านมา
เมื่อโปรแกรมเมอร์บ้านๆอย่างผม ผ่านไปเจอ Object อันหนึ่งที่ไม่เป็นมิตรในการใช้งานสักเท่าไหร่นัก จึงมาบ่นให้ฟัง
เก็บตกบรรยากาศ Agoda Dev Day
มุมมอง 127หลายเดือนก่อน
เก็บตกบรรยากาศ Agoda Dev Day ซึ่งเป็น internal tech conference ของบริษัทครับ
เรียนรู้ Consistent Hashing คืออะไร
มุมมอง 3.1Kหลายเดือนก่อน
แนะนำ Consistent Hashing ซึ่งเป็นเทคนิคสำคัญในการจัดการ load / data ใน distributed system. อีกทั้งยังเป็นเรื่องที่ถูกถามบ่อยในการสัมภาษณ์งาน system design.
HashMap กับ multi-threads มันจะพังได้แบบไหนบ้าง
มุมมอง 192หลายเดือนก่อน
ทุกคนคงรู้ว่า HashMap ธรรมดามันไม่ thread-safe. วันนี้ลองเอามาใช้กับ multi-threads ดู เพิ่งรู้ว่าผลลัพธ์มันออกมาแบบนี้
เดินทางไปสัมภาษณ์งาน on-site ต่างประเทศ เทคนิคเตรียมตัวเล็กน้อย
มุมมอง 7Kหลายเดือนก่อน
เทคนิคการเตรียมตัวเล็กน้อยจากประสบการณ์จริงของผม ในการเดินทางไปสัมภาษณ์งาน on-site ต่างประเทศ
ทำงานต่างประเทศ ครั้งหนึ่งได้ feedback จาก manager ที่ค่อนข้างรุนแรง
มุมมอง 295หลายเดือนก่อน
เล่าความหลังทำงานต่างประเทศ ครั้งหนึ่งได้ feedback จาก manager ที่ดีมากคนหนึ่งว่าผมกำลังทำให้เกิด silent failure
Java ReadWriteLock อาจจะไม่ช่วยเพิ่ม performance ของโปรแกรมในบางกรณี
มุมมอง 1812 หลายเดือนก่อน
ผมได้ผ่านไปเห็นวิดีโอหนึ่งกล่าวว่า เมื่อเอาไปใช้จริงแล้ว overhead ของ ReentrantReadWriteLock ค่อนข้างสูง และบ่อยครั้งมากที่สูงเกินประโยขน์ที่มันทำให้โปรแกรม ผมเลยอยากลองทดสอบดูว่า มันดีกว่า ReentrantLock ธรรมดาในเคสไหน Usage Considerations for Java ReentrantReadWriteLock th-cam.com/video/p4TqsdcJzAg/w-d-xo.html
KafkaSeries 1 : ติดตั้ง cluster แบบ KRAFT mode (แบบไม่ใช้ Zookeeper)
มุมมอง 1812 หลายเดือนก่อน
Kafka cluster installation ในแบบ KRAFT mode ซึ่งเป็นการติดตั้งแบบไม่ใช้ Zookeeper
ผมเรียกตัวเองว่า software engineer ได้หรือไม่
มุมมอง 1.6K2 หลายเดือนก่อน
ผ่านไปเจอคอมเมต์หนึ่งในวิดีโอกล่าวถึงการใช้คำว่า software engineer น่าสนใจเลยอยากแชร์มุมมองของผม Source Video : th-cam.com/video/8c8Y70YKOFw/w-d-xo.html
tcp_retries2 กับ server ที่ตายไม่สงบ
มุมมอง 1652 หลายเดือนก่อน
เคสปัญหาจริงที่ server ตายไปในลักษณะแปลกประหลาด ต้องใช้ การปรับค่า net.ipv4.tcp_retries2 ช่วยในการแก้ปัญา
เล่าความหลัง เจอ deadlock ครั้งแรกในชีวิต
มุมมอง 1223 หลายเดือนก่อน
เล่าเครื่องตอนผม investigate issue อันหนึ่งบน production แล้วพบว่ามันเคือ deadlock.
Java concurrency : คำถามสัมภาษณ์งานต่างประเทศ
มุมมอง 3423 หลายเดือนก่อน
Java concurrency : คำถามสัมภาษณ์งานต่างประเทศ
Dublin walking around, Book of Kells , Dublin castle.
มุมมอง 42ปีที่แล้ว
Dublin walking around, Book of Kells , Dublin castle.
Cork , Ireland - Saint Fin Barre's Cathedral
มุมมอง 101ปีที่แล้ว
Cork , Ireland - Saint Fin Barre's Cathedral
ขออนุญาตแชร์ความเห็นผมด้วยนะครับ น่าสนใจดีครับ ผมคิดว่าท่านี้ค่อนข้างเป็นการ tweak ให้มันทำงานตามต้องการ มากกว่าความเป็นธรรมชาติที่มันควรจะเป็นครับ ปัญหามันคือแค่ topics ที่ถูก pass ไปเพื่อทำการ clean ถูก pass ไปแค่ครั้งเดียว ตอนสร้าง cleaner และยังไม่ได้ถูก clean ในทันทีด้วย "ทั้งที่มันควรถูกส่งไปใหม่ทุกๆครั้งที่เมื่อต้องการ clean" ตรงนี้ครับที่ผมว่ามันผิดธรรมชาติไปนิดจึงต้องมีท่ายากปรับแก้ไขให้เข้ารูปเข้ารอย ส่ิงที่ทำให้ส่ง topics ไปใหม่ไม่ได้ทุกๆครั้งๆที่ต้องการ clean เพราะ logic ยังปนกันอยู่ระหว่าง "การตั้งเวลาการทำงานของ worker" และ "การ clean topics" ถ้า cleaner รับผิดชอบแค่หน้าที่ว่า clean topics ต้องทำยังไง และให้การตั้งเวลาเป็นหน้าที่ของ AggregatorService ปัญหานี้จะจบทันทีเลยครับ สิ่งที่ผมพูดก็คือ เราจะย้าย worker ไปเป็น property ของ Aggregator แทน จากนั้นภายใน method run() ก็สั่ง worker.schedule() แบบเดียวที่ทำใน cleaner แล้ว argument ที่ pass ให้กับ schedule() คือ callback ที่ภายในสั่ง cleaner.cleanStaleMessages(topics) จบเลยครับ แต่ถ้าหากกลัวว่าหากมี service อื่นที่มี topcis เป็น property แบบนี้เหมือนกันแล้วต้องการคลีน เราจะต้อง duplicate logic ที่ service ต้องมี worker คอยตั้งเวลาทำทุกๆ 1 ชั่วโมงแบบนี้ไปเรื่อยๆเหรือเปล่า เราก็สามารถแยก logic ตรงนั้นออกมาเป็นคลาสได้อีกครับ เช่น oneHourWorker.schedule(() => {// ทำอะไรก็ได้ทุกๆ 1 ชั่วโมง }) คือแยก logic ออกมาทำหน้าที่เดียวเลยครับคือ spawn thread มาตั้งเวลา แบบนี้ก็อาจจะมีคำถามอีกว่างั้นจะทำทั้งหมดนี้ต้อง import class หลายๆคลาสที่ทำหน้าที่แยกกันมาทุกครั้งเลยหรือเปล่า งั้นไปสุดทางเลยได้ครับ เราสามารถ compose class ใหม่มาให้มันมีหน้าที่แบบเฉพาะเจาะจงยิ่งขึ้นได้ เช่นชื่อคลาส ScheduleTopicsCleaner ทำให้เวลาจะทำงานแบบนี้ก็ import แค่ custom class นั้นคลาสเดียว แต่ไม่สูญเสียความ flexible แบบเต็มเปี่ยมที่เรามีแต่ละคลาสย่อยๆทำหน้าที่ของตัวเองได้ดีแล้ว อันนี้ขอยกตัวอย่างเป็น code ไปเลยนะครับใน typescript พี่น่าจะอ่านเข้าใจได้ไม่ยาก รบกวนลองพิจารณาดูนะครับ point ผมแค่ การแบ่งคลาสแบบนี้น่าจะยังไม่ได้มีหน้าที่ความรับผิดชอบแบบแม่นยำพอ พี่ถึงได้สะดุดว่าต้องทำยังไงดีจึงออกมาเป็นท่ายากนี้เล็กน้อย แต่พอเข้าใจได้ครับ อยากให้ทำคลิปแบบนี้ออกมาแลกเปลี่ยนอีกเรื่อยๆครับพี่ ชอบมากครับ www.typescriptlang.org/play/?#code/JYOwLgpgTgZghgYwgAgCoHsAOwEG8BQyRywAJgFzIgCuAtgEbQDchxAzmHADYSX3roecECwC++fAi5w2bZACUImdG2Bh0UAJ7ICxZDAhgEACwzYEbABQBKSmZwBtALo7WeolEPUoIZM5Z64uKS0rLIAIIA5pGekXDqUADK0ABuOCi6xOrmbHZYjk4BxADuGgDW0JQA8iAQABLo3gDq5cxuyFIQwpXIiSYQpNQ89hYAwkK1UEVECOggHFDUCAmWnsqqCZqUiutqGprWru5ZxsBsAHTZOHIAvMhrKnta5wZGpvkWNtPuYKcXpVAKlBkHdasVkDV6o0oC1AdAvu09L8zudOt1gaCIOC+sYBkMICM2OMupMEYEJHpFiAbEdjshkRc0ZNURNCZYGZcPmxrN8ghIpDI5Di8cMucT0bSiACgdVag1mq0MVQsRC5dDYUCycQmT1CeLJiDleC9RN4Tz2ky2VcLHlzM5DpljhzpdBzmx+oMeJYaTcAHySulEDk6qAsklWrnmwOiKPEPkhQVoMWm4GOjqsrnsrm2goOxHEGAaZCWWbzMD0j7IdAwCs5POBvTAGtZ8xuzg8esN46ljj3CC0dApCAASRApAgAA9DdaLjBQKRR+OJ961P3Dn6SJBaOcyCCbndrTvSLGu3oe+XPAOhyNp1y3ZguOlVv3ByOx5OADTIAAM1gc38KfMux7QQIHOLh0EiSwAAM4GQDhuBQa0+yvAZyAAElwS9XxGI9RGgk8G3EaN2njAUwkheUYUVAN3VxT0IBLbguHoRAykoH1-RSdAyE7Ok2EMUdICgFJuG9dd-TTQMEGY1iEDKLVjlEL8AEZv3U5AACpkAANm-LTdN-Xl8GCCQgA
Credit free image used in the thumbnail - www.pexels.com/photo/calm-body-of-water-surrounded-by-mountains-3151191/
ดูทำความเข้าใจ มาลองTest 😂
- Video ตอนที่แล้วของผมเรื่อง Consistent Hashing - th-cam.com/video/sZrRXAA8JHg/w-d-xo.html - Code haproxy ส่วนที่ผมคิดว่ามันนำ weight มาคำนวณ virtual node : github.com/haproxy/haproxy/blob/7868dc9c45aeb29774baac98711f563755b610d6/src/lb_chash.c#L550
วะ วะ วะ ไวววววว สุดยอดครับ คลิปเร็ว งานคุณภาพ 😀
😊ขอบคุณคร้าบผม
Nice video krub, i want to know about alternative of "consistency hashing" please leave keyword again?
Thanks very much krub. The alternative is Rendezvous Hashing which is stateless, doesn't need all the complication of virtual node - blog.techlanika.com/rendezvous-hashing-dad794931065
1:56 - เป้าหมายหลักของ Consistent Hashing 5:37 - Evenly distributed load - ใช้โปรแกรมเล็กๆทดสอบการกระจายของ load 7:47 - Partitioning scheme ง่ายด้วยการใช้ modulo 15:14 - Minimal rebalancing 21:22 - Partitioning ด้วยวิธีของ Consistent Hashing 27:01 - Implement Consistent Hashing อย่างง่ายๆ เพื่อความง่าย ผมไม่ได้ check ว่า hash ของแต่ละ replica ซ้ำกันหรือเปล่านะครับ ถ้า imeplment ของจริงต้อง check นะครับ 34:25 - Virtual node
ตอนแก่า Java HashMap ทำงานอย่างไร - th-cam.com/video/JTqruk936qM/w-d-xo.html
ดีมากๆเลยครับ ขอบคุณครับ
ขอบคุณคร้บผม ดีใจมีคนชอบเรื่องนี้ครับ
Art work ในวิดีโอ จาก instagram.com/gulin.watercolor/?hl=en ครับ
Thx a lot nice video krub, i have a question, How do we know if the bloomfilter space initially set is no longer enough?
Thanks very much krub. Most of the time, bloom-filter is used in system that can (more or less) control the expect entries of data krub. In use case of my project, we limit maximum data entries in a chunk of data (1 chunk for one bloom instance). So we let library calculate the size of bloom e.g newBloom(maxNumEntries, false-positive-rate) . So we don't really monitor if false-positive rate is increase or not, we just control the max-entries inserted to the bloom instead.
@@BBConfig Thank for your answer krub 🙏
ข้อมูลเพิ่มเติมที่ผมเพิ่งเห็น ตัว doc เองก็พูดถึงเคสที่ ReadWriteLock อาจจะไม่ช่วยให้ performance ดีขึ้น " if the read operations are too short the overhead of the read-write lock implementation (which is inherently more complex than a mutual exclusion lock) can dominate the execution cost" docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html วิดีโอต้นเรื่องที่ผมไปเจอที่อ้างว่า ReadWriteLock นั้น overhead สูง th-cam.com/video/p4TqsdcJzAg/w-d-xo.html
"Confluent Cloud Is Now 100% KRaft and You Should Be Too" - www.confluent.io/blog/zookeeper-to-kraft-with-confluent-kubernetes/
Data ที่ผมใช้มากจาก Kaggle : Goodreads Book Reviews Data Set - www.kaggle.com/datasets/pypiahmad/goodreads-book-reviews1?select=goodreads_books.json
รู้สึกไม่เสียดายเวลาเลยครับที่เข้ามาดูคลิปนี้
ขอบคุณมากๆครับที่เข้ามารับชมรับฟัง
พี่จบตรงสายหรือเป็น self-taught ครับ
ผมจบสายตรง software engineer ครับ แต่ 90% ที่ใช้ในงานคือ self-taught ครับ เพราะสายนี้มันเปลี่ยนแปลงเร็วมาก
คลิปมีประโยชน์มากครับ ผมเรียนเขียนโค้ดได้1ปี คลิปนี้ช่วยให้เห็นจุดที่ควรพัฒนาตัวเองต่อไปเลยครับ
ขอบคุณคร้าบ สู้ๆครับผม ความชำนาญมาจากการฝึกฝน เป็นกำลังใจให้คร้าบ
Thankyou for your content, It's cool 🙏
ขอบคุณคร้าบผม 🙂
ความรู้ใหม่เลยครับ
ขอบคุณสำหรับคอมเมนต์คร้าบผม ดีใจมีผู้รับชมรับฟังครับ
0:37 requestor กับการขอข้อมูลจาก server สำรอง 4:37 โปรแกรมง่ายๆเพิ่อใช้ในการทดสอบปัญหา 12:30 ใช้ iptables เพื่อ drop packet ขาออกจาก server 16:52 tcp retransmit 23:00 ปรับค่า tcp_retries2
Timeline 1:13 เริ่มเขียน feed / client แบบ step-by-step เพื่อแสดงให้เห็นการทำงานที่ต้องการ 9:52 Client พิเศษที่เป็นจุดเริ่มให้มีการใช้ lock สองตัว 16:46 สิ่งที่ทำให้เกิด deadlock 18:28. jstack and thread dump 24:36. อธิบายอีกครั้งให้ละเอียดขึ้น 34:12 CountdownLatch
ขอแก้ความคลาดเคลื่อนนาทีที่ 8:53 เวลาหา node ที่ต้องการ โค้ดจะหา key ที่ตรงกันนะครับ ในคลิปผมพูดผิดว่าหา value ที่ตรงกัน
Hey. Do you like this tour?
You seemed so relaxed lol 😆
It's always raining when I am in Cork
I was lucky that the next two days were sunny so I could walk around the city. I also went to Killarney and had a very nice time there.
Nice work!
Thanks a lot 😊