<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Microservices &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<atom:link href="https://myifew.com/tag/microservices/feed/" rel="self" type="application/rss+xml" />
	<link>https://myifew.com</link>
	<description></description>
	<lastBuildDate>Wed, 29 Sep 2021 10:18:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://myifew.com/wp-content/uploads/2018/07/cropped-logo6-ts-32x32.png</url>
	<title>Microservices &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<link>https://myifew.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>10 ข้อแนะนำ สำหรับการทำ Microservices ที่ดี  (และ ทำ API ที่ดี)</title>
		<link>https://myifew.com/6065/microservice-best-practice/</link>
					<comments>https://myifew.com/6065/microservice-best-practice/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Wed, 29 Sep 2021 10:09:04 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Microservices]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=6065</guid>

					<description><![CDATA[เพิ่งไปอ่านเจอบทความหนึ่ง เห็นน่าสนใจดี เป็นการอธิบายคุณสมบัติ Microservices ที่ประโยชน์มาก และชัดเจนดี ขอบันทึกไว้สักหน่อย]]></description>
										<content:encoded><![CDATA[
<p>เคยเขียนเรื่อง <a href="https://myifew.com/4315/what-is-microservices/" data-type="post" data-id="4315">6 ข้อที่จะบอกว่าระบบคุณเป็น Microservices หรือไม่ และมีประโยชน์อย่างไร</a> นานแล้ว เพื่อบอกว่า Microservices ควรมีคุณสมบัติอย่างไรบ้าง แต่ค่อนข้าง Technical และเจาะจงกับ Microservices ไปหน่อย</p>



<p>เพิ่งไปอ่านเจอบทความหนึ่ง เห็นน่าสนใจดี เป็นการอธิบายคุณสมบัติ Microservices คล้ายกับบทความแรกที่ผมเขียน แต่เห็นประโยชน์แต่ละข้อชัดเจนมาก และคิดว่าดัดแปลงไปใช้กับ API Service ทั่วไปได้ด้วย เลยขอบันทึกไว้สักหน่อย</p>



<span id="more-6065"></span>



<h2 class="wp-block-heading">1. ยึดหลักการ ทำหน้าที่เดียวเท่านั้น </h2>



<p>แต่ละ Service หรือ API ควรออกแบบขอบเขตการทำงานให้ดี เพื่อไม่ให้เกิดความซับซ้อน และความเกี่ยวข้องกัน เพราะธุรกิจมีความเปลี่ยนแปลงอยู่ตลอดเวลา การไม่ผูกมัดกันไว้ จะง่ายกับการเปลี่ยนแปลงในอนาคต ไม่ว่าจะเปลี่ยนในเชิง Business หรือ Technical ก็ตาม</p>



<p>ตัวอย่าง เช่น Microservices ของแอพสั่งอาหาร ที่สามารถออกแบบตามหน้าที่การทำงานแต่ละส่วนได้ (functionality) เช่น InventoryService, OrderService, PaymentsService, UserProfileService, DeliveryNotificationService</p>



<h2 class="wp-block-heading">2. แยกการเก็บ Data ออกจากกัน </h2>



<p>การใช้ Database ร่วมกัน ก็หมายถึงการพังพร้อมกันด้วยเช่นกัน และการทำงานของแต่ละ Service อาจต้องการความเหมาะสมของ Database ต่างกันด้วย หรือลักษณะ Configuration ที่ต่างกันด้วย </p>



<p>ตัวอย่าง เช่น ProductService จะถูกเก็บลง MongoDB, ส่วน OrderService จะถูกเก็บด้วย PostgreSQL</p>



<p>ปล. ผมเคยมีคำถามในใจว่า ทำไมต้องแบ่งให้ยุ่งยาก และรู้สึกไม่เป็นประโยชน์เท่าไร, คำตอบที่ตอบตัวเองคือ ระบบเราไม่ใหญ่พอ คนใช้ไม่มากพอ ที่ควรจะต้องไปลงทุนแยก Database หรือแม้แต่ทำ Microservices</p>



<h2 class="wp-block-heading">3. สื่อสารกันด้วย Asynchronous </h2>



<p>นอกจากการเขียนโค้ดที่ลดผลกระทบต่อกันแล้ว (Loose Coupling) การสื่อสารระหว่าง Service เป็นอีกจุดที่ต้องทำ เพื่อเป็นการลดความผูกมัดกันของแต่ละ Service ได้ </p>



<p>ตัวอย่างเช่น เมื่อบันทึก Order ลงฐานข้อมูลเสร็จแล้ว ระบบไม่จำเป็นต้องรอส่งอีเมลให้เสร็จ ถึงจะ return ว่าการทำงานนี้สำเร็จ</p>



<h2 class="wp-block-heading">4. ปิดปัญหาให้ไวด้วย Circuit Breaker</h2>



<p>ถ้า Microservice ของเราต้องไปเกี่ยวข้องกับ Service ภายนอก และจะทำงานต่อได้ ก็ต่อเมื่อต้องรอ return ผลลัพธ์จากระบบนั้นด้วย ประเด็นคือ ถ้าทำการเชื่อมต่อไม่ได้ จะต้องรอนานแค่ไหน หรือทำอย่างไรต่อ</p>



<p>สิ่งที่ควรทำไว้ คือ กำหนดเวลา Timeout และมีการ return ค่าเริ่มต้น (default) หรือแจ้ง error เพื่อเป็นการตัดจบ และทำ rollback, recovery ต่อไป และ Service ลักษณะแบบนี้ ควรแยกออกไปจาก Service อื่นๆ ให้ได้มากที่สุด เพื่อลดผลกระทบที่จะพังต่อกันเป็นทอดๆ </p>



<h2 class="wp-block-heading">5. เรียกใช้ Microservice ผ่าน API Gateway</h2>



<p>การใช้ API Gateway มาคั่น แทนการเชื่อมต่อโดยตรงไปที่ Microservice มีข้อดีหลายข้อนะ </p>



<ul class="wp-block-list"><li>เราไม่จำเป็นต้องทำให้ Service ทุกตัวต้องมีฟังก์ชันของการ Authentication, Logging, Throttling ก็ได้ เพราะจะทำให้ทุก Service มีขนาดใหญ่ และดูแลจัดการยาก </li><li>ลดภาระให้แก่ Client ที่จะต้องต่อหลาย Service Endpoint</li><li>ช่วยเรื่อง Security เพื่อเป็นการปิดบัง URL ที่แท้จริงของแต่ละ Service</li><li>เปลี่ยนแปลงฝั่ง Backend ที่ต่อกับ Microservice ในภายหลังได้ เช่น ต้องการเปลี่ยนไปใช้ Version ใหม่ ซึ่งทาง Client เองก็ไม่ต้องไปแก้ไขโค้ดใหม่</li><li>ควบคุม incoming traffic และปฏิเสธิการเรียกใช้แบบไม่ได้รับอนุญาตได้</li><li>กำหนด API Gateway ให้ใช้สำหรับ Internal/External เท่านั้น ก็ได้</li></ul>



<p>ปล. มีข้อดีมากก็จริง แต่ข้อเสียก็มี เพราะเป็น Single point of Failure นะ, อาจเกิดคอขวดได้นะ, เป็นระบบที่ใช้ทุกคน ดังนั้น ใครดูแลล่ะ และต้องดูแลให้ดีด้วยนะ</p>



<h2 class="wp-block-heading">6. ต้องแน่ใจว่า Service สามารถใช้งานกับผู้ใช้เก่าๆ ได้ (Backwards Compatible)</h2>



<p>ถึงแม้ว่าจะออกแบบระบบเป็น <span style="font-size: revert; color: initial; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen-Sans, Ubuntu, Cantarell, &quot;Helvetica Neue&quot;, sans-serif;">Microservice</span> และมี CI/CD ที่สามารถ deploy ระบบขึ้นไปเมื่อไรก็ได้ แต่ต้องมั่นใจว่า ผู้ใช้เก่ายังคงต้องทำงานได้อยู่ ซึ่งวิธีแก้ปัญหาที่นิยมทำกันคือ แจ้งการเปลี่ยนแปลงให้แก่ Client ทั้งหมด ว่าจะเกิดขึ้นวันไหน และตัดการรองรับใน Version เก่า เมื่อไรม แต่การแก้ปัญหาแบบนี้ จะใช้เวลาประสานงาน และบาง Client ก็อาจไม่พร้อมเปลี่ยนแปลงในเร็ววัน ทำให้ระบบเราต้องเลื่อนการ deploy ออกไปอีก</p>



<p>สิ่งที่แนะนำให้ทำนอกเหนือจากประสานงานข้างต้น คือการทำ Test ในส่วนของ Service เราเองให้มีส่วนที่ Coverage ทั้งการเรียกใช้แบบเก่าและแบบใหม่ รวมไปถึงการทำ Stub Data และแจ้งให้ฝั่ง Client ทำ Contract Test กับระบบเขาดูว่าสามารถใช้งานได้ปกติหรือไม่</p>



<h2 class="wp-block-heading">7. ปลดระวาง Version ที่ไม่ได้ใช้ออกไป</h2>



<p>ถึงแม้จะต้องทำให้ใช้งานกับผู้ใช้เก่าๆ (Backwards Compatible) ได้ก็จริง แต่ก็ต้องมีเงื่อนไขและเวลาที่ต้องปลดระวาง Version เก่าออกไป เพื่อลดการดูแลรักษา และการใช้ทรัพยากรหรือค่าใช้จ่ายที่ไม่จำเป็น</p>



<p>ปล. โดยปกติ Open API ใหญ่ๆ อย่าง Facebook จะแจ้งล่วงหน้า 1-2 ปี เพื่อให้เวลาในการ Migrate เป็น Version ซึ่งถ้าตรวจพบว่าไม่ทำ จะไม่สามารถเชื่อมต่อได้เลย</p>



<h2 class="wp-block-heading">8. แยก Infrastructure Hosting ของแต่ละ Microservice ออกจากกัน</h2>



<p>นอกเหนือจาก Database ที่ต้องแยกของแต่ละ Service แล้ว เราควรแยกการ Host ด้วย, ด้วยเหตุผลเดียวกันคือ ถ้าพัง ไม่ควรจะต้องพังไปด้วยกันหมด เช่น HDD เต็ม, HDD พัง, Memory หมด, CPU สูง เป็นต้น</p>



<p>และข้อดีอีกประการหนึ่งคือ บาง Service มีการเรียกใช้งานสูง เราจะสามารถ Scale ออกไปหรือเพิ่ม Spec สำหรับให้บริการเฉพาะ Service นั้นได้ เท่าที่จำเป็น</p>



<p>ปล. หลายที่ใช้เป็น Container เพื่อใช้งานในแต่ละ Service แต่อย่าลืมว่า 1Service 1Container ก็อาจจะพังได้ ดังนั้น เพื่อให้เกิด Availability ในระบบเรา <a href="https://myifew.com/5972/kubernetes-on-amazon-eks/" data-type="post" data-id="5972">Kubernetes</a> อาจจะต้องเข้าแล้วหนึ่ง สภาพพพ!!</p>



<h2 class="wp-block-heading">9. การ Deploy ต้องไม่เกี่ยวข้องกัน</h2>



<p>ใน Service แต่ละตัว เมื่อไม่ผูกมัดกัน ไม่ส่งผลกระทบต่อกันแล้ว ก็จะต้องสามารถ Deploy ได้โดยที่ไม่เกี่ยวข้องกันด้วย กล่าวคือ ไม่จำเป็นว่า ต้อง Deploy A ก่อน แล้วถึงจะ Deploy B ต่อไปได้ </p>



<h2 class="wp-block-heading">10. สร้างประสิทธิภาพการทำงานในองค์กร</h2>



<p>เมื่อ Microservices มีอิสระต่อกันทั้งทีมพัฒนา ทั้งการโค้ด ทั้งการออกแบบ แม้กระทั้งการ Deploy แล้ว สิ่งหนึ่งที่จะต้องปรับด้วยคือมาตรฐานในการออกแบบและเขียนโค้ด (Standards) เพื่อไม่ให้แต่ละทีมต้องเสียเวลาในการออกแบบและสร้าง Solution ของตนเองโดยไม่จำเป็น และยากกับการดูแลรักษาในอนาคตด้วย และเสียรูปแบบการทำงานร่วมกันด้วย</p>



<p>เรื่องนี้สำคัญมากๆนะ เพราะ Service แต่ละตัวถูกสร้างจากคนละทีม แต่ต้องทำงานร่วมกัน ดังนั้น ควรคุยกันก่อนเริ่มทำงาน เช่น API security, log aggregation, monitoring, API documentation, secrets management, config management, distributed tracing ฯลฯ</p>



<h2 class="wp-block-heading">สรุป</h2>



<p>หากเราได้ออกแบบและทำ Service ตามคำแนะนำทั้ง 10 ข้อ แล้วหละก็ เราจะได้ใช้คุณประโยชน์ของ Microservices ตามที่มันถูกคิดขึ้นมา นั่นคือ ไม่ส่งผลกระทบกัน (loosely coupled), กระจายการทำงาน (distributed) และ อิสระจากกัน (independent)</p>



<h2 class="wp-block-heading">Reference</h2>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" href="https://www.capitalone.com/tech/software-engineering/10-microservices-best-practices/" data-type="URL" data-id="https://www.capitalone.com/tech/software-engineering/10-microservices-best-practices/" target="_blank">10 Microservices Best Practices for the Optimal Architecture Design</a></li><li>รูปปกจาก <a href="https://www.360logica.com/blog/top-5-best-practices-for-testing-a-microservice-application/">https://www.360logica.com/blog/top-5-best-practices-for-testing-a-microservice-application/</a> </li></ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/6065/microservice-best-practice/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ลองทำ PHP Serverless ง่ายๆ ด้วย bref</title>
		<link>https://myifew.com/5628/build-php-serverless-by-bref/</link>
					<comments>https://myifew.com/5628/build-php-serverless-by-bref/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Sat, 07 Mar 2020 16:30:08 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5628</guid>

					<description><![CDATA[ไหนๆ ก็เขียน PHP อยู่แล้ว เลยมาลองทำเป็น Serverless ทดสอบบน AWS Lambda สักหน่อย ถ้าวิธีปกติคือทำเป็น Custom Runtime แต่ขั้นตอนอาจจะยุ่งยากนิดนึง เลยมีคนทำเครื่องมือชื่อ bref ขึ้นมา ใช้ง่ายมากครับ&#8230;]]></description>
										<content:encoded><![CDATA[
<p>ไหนๆ ก็เขียน PHP อยู่แล้ว เลยมาลองทำเป็น Serverless ทดสอบบน AWS Lambda สักหน่อย ถ้าวิธีปกติคือทำเป็น <a rel="noreferrer noopener" aria-label="PHP Custom Runtime (opens in a new tab)" href="https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/" target="_blank">Custom Runtime</a> แต่ขั้นตอนอาจจะยุ่งยากนิดนึง เลยมีคนทำเครื่องมือชื่อ <a rel="noreferrer noopener" href="https://bref.sh/" target="_blank">bref</a> ขึ้นมา ใช้ง่ายมากครับ ลองมาดูวิธีทำกัน</p>



<span id="more-5628"></span>



<h2 class="wp-block-heading">bref คืออะไร</h2>



<p><a rel="noreferrer noopener" href="https://bref.sh/" target="_blank">bref</a> เป็นเครื่องมือ open source หนึ่งที่ไว้ deploy และ run serverless สำหรับภาษา PHP โดยมันไป integrate กับ <a rel="noreferrer noopener" href="https://serverless.com/" target="_blank">Serverless Framework</a> อีกที (แน่นอน ต้องติดตั้ง Serverless Framework ก่อน) ซึ่งปัจจุบันใช้ได้เฉพาะ AWS Lambda เท่านั้น</p>



<h2 class="wp-block-heading">สิ่งที่ต้องมีในเครื่อง</h2>



<ul class="wp-block-list"><li>PHP 7.2+</li><li>Composer</li><li>AWS account (ต้องมี permission อย่างน้อย: CloudFormation, CloudWatch, Lambda, S3, API Gateway)</li><li>Node.js</li></ul>



<h2 class="wp-block-heading">จัดแจงเตรียมเครื่องมือทำงาน</h2>



<p><strong>ตรียม AWS Credential Key และ Secret Code</strong> (ถ้ามีแล้ว ข้ามได้ครับ)</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="663" height="294" src="https://myifew.com/wp-content/uploads/2020/03/AWS_Security_Credentials9-1.png" alt="" class="wp-image-5629"/></figure>



<p><strong>Install serverless</strong> (ถ้ามีแล้ว ข้ามได้ครับ)</p>



<pre class="wp-block-code"><code>npm install -g serverless</code></pre>



<p><strong>Config serverless with AWS</strong> (ถ้าเคยทำแล้ว ข้ามได้ครับ)</p>



<pre class="wp-block-code"><code>serverless config credentials --provider aws --key &lt;key> --secret &lt;secret></code></pre>



<p><strong>สร้างโฟลเดอร์ที่จะใช้งาน</strong></p>



<pre class="wp-block-code"><code>mkdir php-bref-function</code></pre>



<p><strong>Install bref</strong></p>



<pre class="wp-block-code"><code>composer require bref/bref</code></pre>



<h2 class="wp-block-heading">ทำ PHP Function Serverless ตัวแรก</h2>



<p><strong>Create PHP Lambda</strong></p>



<pre class="wp-block-code"><code>vendor/bin/bref init</code></pre>



<p>เมื่อ Enter จะแสดงข้อความให้เลือกประเภท Lambda</p>



<pre class="wp-block-code"><code>What kind of lambda do you want to create? (you will be able to add more functions later by editing `serverless.yml`) [PHP function]:
  [0] PHP function
  [1] HTTP application
  [2] Console application</code></pre>



<p>ในที่นี้เราจะสร้าง PHP Function สามารถกด Enter ผ่านไป หรือกดคีย์หมายเลข 0 ก็ได้ จะได้ไฟล์ประมาณนี้</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1752" height="680" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-init.png" alt="" class="wp-image-5630"/></figure>



<p><strong>Config PHP Lambda</strong></p>



<p>เมื่อสร้าง Application เสร็จ ให้แก้ไขไฟล์ serverless.yml ดังนี้</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1258" height="900" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-config.png" alt="" class="wp-image-5631"/></figure>



<p>โดย</p>



<p><strong>provider &gt; region</strong> : คือทวีปที่เราใช้ AWS โดยทั่วไปที่ไทยใช้เป็น ap-southeast-1 <br><strong>functions &gt; php-bref-function</strong> : โดย php-bref-function ชื่อ function เราแก้ตามที่ต้องการได้เลย<br><strong>functions &gt; handler</strong> : ช่องทางแรกที่ Lambda จะเรียกทำงาน<br><strong>functions &gt; layers</strong> : เป็น custom runtime แต่ในที่นี้ bref ได้สร้างเป็น layer เพื่อเรียกใช้งาน ไม่เอามาผสมกับ core code ของเรา (ทำความเข้าใจ <a rel="noreferrer noopener" aria-label="AWS Lambda Layer (opens in a new tab)" href="https://myifew.com/5189/working-with-aws-lambda-layers-and-csharp-net-core2/" target="_blank">AWS Lambda Layer คืออะไร</a>)</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>อธิบายเพิ่มเติมเกี่ยวกับ Layers</strong><br><strong>สำหรับ PHP functions ให้ระบุเป็น php-74 หรือ php-73 </strong><br>ใช้สำหรับสร้าง PHP function เพื่อประมวลผลเท่านั้น ไม่ใช่  HTTP Application<br><br><strong>สำหรับ HTTP applications ให้ระบุเป็น php-74-fpm หรือ php-73-fpm </strong><br>โดย runtime ตัวนี้จะใช้ PHP-FPM เพื่อทำงานแบบ HTTP applications จะเหมือนกับที่เราเขียน PHP ปกติ คือเขียนเสร็จแล้วต้องเปิดผ่าน PHP hosting หรือพวก Nginx, Apache (สามารถใช้ได้กับ Symfony และ Laravel ได้ด้วยนะ)<br>(Read more at <a href="https://bref.sh/docs/runtimes/#bref-runtimes" target="_blank" rel="noreferrer noopener" aria-label="https://bref.sh/docs/runtimes/#bref-runtimes (opens in a new tab)">https://bref.sh/docs/runtimes/#bref-runtimes</a>)</p></blockquote>



<h2 class="wp-block-heading">ทดสอบ PHP Function Serverless บน localhost</h2>



<p>เมื่อสร้างเสร็จแล้ว ลองทดสอบบนเครื่องตัวเองได้นะครับ ด้วยคำสั่งนี้</p>



<pre class="wp-block-code"><code>serverless invoke local --docker -f &lt;function-name></code></pre>



<p>เปลี่ยน &lt;function-name&gt; ให้เป็นชื่อ function ของเรา ซึ่งที่นี้คือ <strong>php-bref-function</strong> โดยผลลัพธ์ &#8220;Hello World&#8221;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1754" height="288" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-invocation-localhost.png" alt="" class="wp-image-5632"/></figure>



<p>แต่ถ้าอยากส่ง data payload เข้าไป ให้ใช้คำสั่งนี้</p>



<pre class="wp-block-code"><code>serverless invoke local --docker -f &lt;function-name> --data '{"name": "iFew"}'</code></pre>



<p>ผลลัพธ์ที่ได้คือ &#8220;Hello iFew&#8221;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1754" height="292" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-invocation-localhost-payload.png" alt="" class="wp-image-5633"/></figure>



<h2 class="wp-block-heading">ทำการ Deploy PHP Function Serverless เพื่อทดสอบบน AWS Lambda</h2>



<p>จะลอง Deploy ขึ้นไปทดสอบบน AWS Lambda ด้วยคำสั่ง</p>



<pre class="wp-block-code"><code>serverless deploy</code></pre>



<p>จะได้ผลลัพธ์ประมาณนี้</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1380" height="762" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-deploy.png" alt="" class="wp-image-5635"/></figure>



<p>สังเกตว่ามีจะมีการ pack file และทำการ upload ขึ้นไปไว้บน S3 เพื่อพักไว้ก่อน และ Deploy ไปที่ Lambda อีกที</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2644" height="1122" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-on-aws-lambda.png" alt="" class="wp-image-5636"/></figure>



<p>ทดสอบอีกรอบว่า บน AWS Lambda ใช้งานได้จริงหรือไม่</p>



<pre class="wp-block-code"><code>serverless invoke -f &lt;function-name></code></pre>



<p>ถ้าใช้งานได้ ก็จะแสดง output ออกมาตามที่โค้ดเราเขียนไว้ </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1148" height="94" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-invocation.png" alt="" class="wp-image-5637"/></figure>



<h2 class="wp-block-heading">ผลการทดสอบความเร็ว ของ PHP Function Serverless ด้วย bref</h2>



<p>ทำงานด้วย Memory 1024MB (ค่ามาตรฐาน) ได้ประมาณ​ 14-15ms</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2604" height="1268" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-memory1024mb.png" alt="" class="wp-image-5638"/></figure>



<p>ทำงานด้วย Memory 256MB ได้ประมาณ​ 75-80ms</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2590" height="1218" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-memory256mb.png" alt="" class="wp-image-5639"/></figure>



<p>ทำงานด้วย Memory 128MB ได้ประมาณ​ 270-290ms</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2590" height="1234" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-function-memory128mb.png" alt="" class="wp-image-5640"/></figure>



<h2 class="wp-block-heading">ลองทำ PHP HTTP Application Serverless ดูบ้าง</h2>



<p>วิธีการทำแบบเดิมเลยครับ ต่างกันตอนเลือกประเภท Lambda ให้เลือกประเภท [1] HTTP application แทน พร้อมกับแก้ serverless.yml ในหัวข้อ function &gt; layer ให้เป็น php-74-fpm หรือ php-73-fpm แทน</p>



<p>วิธีการทดสอบบน localhost ให้ใช้คำสั่ง ดังนี้</p>



<pre class="wp-block-code"><code>php -S localhost:8000 index.php</code></pre>



<p>จากนั้นเปิด browser ไปที่ http://localhost:8000 จะเจอหน้าตาแบบนี้</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2866" height="1492" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-http-invocation-localhost.png" alt="" class="wp-image-5641"/></figure>



<p>ซึ่งเมื่อเรา Deploy ไปอยู่บน AWS Lambda ขั้นตอนของ bref จะทำการ upload ไป S3 และ deploy ไป Lambda เหมือนกับกรณี PHP Function แต่เพิ่มเติมคือ จะไปทำการสร้าง API Gateway ให้ด้วย เพื่อเป็นช่องทางการ access เข้าไปใช้งาน ไม่ว่าจะเป็น Website หรือ API (ให้ดูที่ endpoints)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1428" height="820" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-http-deploy.png" alt="" class="wp-image-5642"/></figure>



<p>ถ้าลองเปิด url ดูแล้วก็จะได้เหมือนกับที่ลองใน localhost</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-http-on-aws-lambda.png" alt="" class="wp-image-5643" width="580" height="301"/></figure>



<p>ส่วนผลการทดสอบความเร็ว จะไม่สามารถ invocation ได้นะครับ ต้องเปิดผ่าน API Gateway เท่านั้น</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2602" height="1248" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-http-cant-invocation.png" alt="" class="wp-image-5644"/></figure>



<p>ผมลองดู SPeed Network ด้วย Chrome แต่ความเร็วที่ได้ มันผ่าน stack ชั้น API Gateway ก่อน เลยทำให้ไม่รู้ว่า AWS Lambda จริงๆทำงานเร็วแค่ไหน แต่ผลลัพธ์ที่ได้ อยู่ราวๆ 80-100ms ถือว่าเร็วเลยหละ</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2880" height="1238" src="https://myifew.com/wp-content/uploads/2020/03/php-bref-http-test-on-chrome-1.png" alt="" class="wp-image-5650"/></figure>



<h2 class="wp-block-heading">วิธีการลบ PHP Serverless Application บน AWS Lambda</h2>



<p>ผมแนะนำว่าให้ใช้คำสั่งแทนนะครับ เพราะการไปลบบน AWS Lambda อย่างเดียว อาจจะไม่ครบ อาจจะต้องไปตามหาใน S3, CloudFormation, API Gateway และอาจจะหลายสิ่ง จึงแนะนำให้ใช้คำสั่งของ serverless แทน ดังนี้ครับ</p>



<pre class="wp-block-code"><code>serverless remove</code></pre>



<p>อยากลบตัวไหน ให้เข้าไปที่ folder ของ application นั้น มันจะทำการลบตามที่เรา config ในไฟล์ serverless.yml ครับ</p>



<h2 class="wp-block-heading">สรุป</h2>



<p>ถ้าใครอยากทำ Serverless ด้วย PHP และ AWS Lambda ผมแนะนำให้ใช้ <a rel="noreferrer noopener" href="https://bref.sh/" target="_blank">bref</a> เลยครับ ค่อนข้างสะดวก ส่วนเรื่องความเร็วที่ได้ถือว่าประทับใจ เมื่อเทียบกับ .NET Core  (ใน Memory เท่ากัน) แต่ก็ยังช้ากว่า Node.js, Go, Python</p>



<p><strong>ข้อสังเกต</strong></p>



<ol class="wp-block-list"><li>Default Memory คือ 1024MB ระวังให้ดีว่าจะเผลอเสียเงินเยอะโดยใช้เหตุครับ</li><li>Default Timeout คือ 6 วินาที</li><li>ไม่พบ Cold Start จากการ run ครั้งแรก เพราะครั้งต่อๆ ไป ก็ยังทำงานด้วยเวลาพอกัน</li></ol>



<p><strong>ตัวอย่างโค้ด</strong></p>



<ul class="wp-block-list"><li>PHP HTTP Application : <a href="https://github.com/ifew/php-bref-http">https://github.com/ifew/php-bref-http</a></li><li>PHP Function : <a href="https://github.com/ifew/php-bref-function">https://github.com/ifew/php-bref-function</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5628/build-php-serverless-by-bref/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>9 วิธีจัดการกับ Cold Start ใน Serverless ให้ทำงานได้ไวที่สุด พร้อมตัวอย่าง</title>
		<link>https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/</link>
					<comments>https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 30 May 2019 12:50:32 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Cold Start]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Performance Test]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5386</guid>

					<description><![CDATA[Update 6 Nov 2019 &#8211; ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้ US West&#8230;]]></description>
										<content:encoded><![CDATA[
<p><strong>Update 6 Nov 2019</strong> &#8211; ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้ US West (N. California), EU (Ireland), EU (Paris), Asia Pacific (Mumbai), Asia Pacific (Seoul), Asia Pacific (Singapore), Asia Pacific (Sydney), and South America (San Paulo)    &#8211; ที่มา <a rel="noreferrer noopener" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a> </p>



<p><strong>Update 27 Sep 2019</strong> &#8211;  ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้  US East (Ohio), EU (Frankfurt), and Asia Pacific (Tokyo)  &#8211; ที่มา <a rel="noreferrer noopener" aria-label="aws.amazon.com (opens in a new tab)" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a></p>



<p style="text-align:center">&#8230;</p>



<p>ผมเชื่อว่าใครก็ตามที่ตัดสินใจทำ Serverless มักเจอปัญหาที่แก้ไม่ตกคือ เรื่อง Cold Start ซึ่งบล็อกนี้ผมขอแชร์ประสบการณ์ที่ได้แก้ปัญหาทั้งหมด 9 วิธี เผื่อจะเป็นประโยชน์กันนะครับ  (ขออ้างอิงจากผู้ให้บริการ AWS Lambda และภาษาที่ใช้พัฒนา C# .NET Core)</p>



<span id="more-5386"></span>



<h2 class="wp-block-heading">ทำความเข้าใจ Cold Start คืออะไร</h2>



<p>ขอเกริ่นถึงสั้นๆ ของการทำงาน Serverless คือ เมื่อมีการร้องขอ (Request) ไปที่  Instances (เข้าใจง่ายๆ คือ Server ตัวหนึ่ง) เพื่อให้มันทำงาน มันจะใช้เวลาช่วงหนึ่งเพื่อทำการ Initial Instances จากนั้นค่อยเรียกโค้ดที่เราเขียน ขึ้นมาทำงานตามคำสั่ง </p>



<p>เมื่อมีการเรียกซ้ำอีก มันก็จะทำต่อเนื่องได้ทันที ไม่ต้องเสียเวลา Initial Instances ใหม่ แต่เมื่อทำงานเสร็จและปล่อยไว้สักระยะหนึ่ง เจ้า Instances ตัวนั้นก็จะเข้าสู่โหมด Idle อีก (หรือบางคนเรียกว่า หลับ, sleep) ดังนั้นเมื่อมีการร้องขอ (Request) ใช้งานอีกครั้ง จะเกิดกระบวนการ Initial Instances แบบเดิม ก่อนที่จะทำงานโค้ดของเรา</p>



<p>การ Initial Server ในครั้งแรก หรือครั้งหลังจากโหมด Idle นี่เอง เราจะเรียกว่า Cold Start</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="578" src="https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-1200x578.jpeg" alt="" class="wp-image-5286" srcset="https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-1200x578.jpeg 1200w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-1024x493.jpeg 1024w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-768x370.jpeg 768w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-700x337.jpeg 700w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-600x289.jpeg 600w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client.jpeg 1266w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>Initial Instances หรือ Cold Start คือช่วงตั้งแต่ Download the code, Container Setup, Initialization and start of the code</figcaption></figure>



<p>และมากกว่านั้น ภาษาที่ต้องมีการ Compile จะมีขั้นตอน 1-3 นานกว่าภาษา Script หลายเท่า (ผมลองพ่น Hello World โดยใช้ Node ไม่ถึง 1 วินาที, เทียบกับ .Net Core ใช้เวลา 4-5 วินาที)</p>



<p>และมีคำถามบ่อยๆ ว่าจะเข้าสู่โหมด Idle ภายในกี่นาที คำตอบคือ ไม่มีใครสามารถตอบได้ชัดเจน บางแหล่งก็บอก 30-45 นาที บางแหล่งก็บอก 15 นาที แต่สำหรับผมที่เล่นเอง จะเจอแถวๆ 5 นาทีเป็นต้นไป เรียกได้ว่าลุกไปเข้าห้องน้ำแป๊บนึง พอกลับมา มันก็ช้าอีกแล้ว (ผมใช้ AWS Lambda ที่ ap-southeast-1)  </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1624" height="860" src="https://myifew.com/wp-content/uploads/2019/05/estimate-time-to-sleep.png" alt="" class="wp-image-5407"/><figcaption>ความเป็นไปได้ที่จะเกิด Cold Start หลังมีการเรียกใช้ไปแล้ว x นาที (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a>)</figcaption></figure>



<p>อ่านพื้นฐานเรื่อง Serverless และ AWS Lambda ฉบับเต็มได้ที่ </p>



<ul class="wp-block-list"><li><a href="https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/">มาทำความรู้จักกับ Serverless และ AWS Lambda ฉบับคนคิดจะใช้</a></li></ul>



<h2 class="wp-block-heading">9 วิธีเพื่อใช้ลดเวลา Cold Start</h2>



<p>คราวนี้ Cold Start ได้เป็นเสี้ยนหนามของผมมาก สุดท้ายแล้ว ผมพบว่ามี 9 วิธี ที่จะลดเวลา Cold Start ได้ ผู้อ่านสามารถเลือกไปทำ หรือจะทำทั้งหมดเลยก็ได้ ลองดูกันว่ามีวิธีใดบ้าง</p>



<ol class="wp-block-list"><li>เพิ่ม Memory Allocated</li><li>Lean and Clean Code</li><li>ลด และ/หรือ เลือกใช้ Dependency ที่จำเป็นและเหมาะสม</li><li>Warm ตัว Server ของเราตลอดเวลา</li><li>Warm ตัว Server ของเราตามเวลาที่เหมาะสม</li><li>ใช้ Custom Runtimes และเลือกใช้ Runtimes ที่ทำงานได้เร็ว</li><li>ใช้ Custom Runtimes และทำเป็น Native App</li><li>หลีกเลี่ยงการใช้ VPC ถ้าไม่จำเป็น</li><li>เลือกภาษาเพื่อใช้ทำ Serverless ที่เหมาะสม</li></ol>



<h2 class="wp-block-heading">1. เพิ่ม Memory Allocated</h2>



<p>วิธีง่ายที่สุดคือใช้เงินจอง Memory ให้กับ AWS Lambda Instances มากๆ (Memory Allocated) ซึ่งมันก็เห็นผลได้เร็วและชัดเจนซะด้วย </p>



<p>กรณีแบบนี้ผมคิดว่าเหมาะกับการคำนวณ (Compute) ที่ไม่ได้เกิดขึ้นบ่อย แต่ต้องทำงานได้ไว และไม่ต้องการแก้ไขให้ยุ่งยาก &#8212; หรือพูดสั้นๆ คือ ยอมจ่ายค่า Memory ที่แพงขึ้น แลกกับ Duration Time ที่ลดลง แต่นานๆที เรียกใช้</p>



<p>กรณีนี้ผมทดลองด้วย C# .NET Core 2.1 ดึงข้อมูลจาก MySQL จำนวน 3 รายการ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2542" height="1214" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-128.png" alt="" class="wp-image-5387"/><figcaption>Memory Allocated 128 MB &#8211; Duration Time 10,169 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1473" height="234" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-256.png" alt="" class="wp-image-5388"/><figcaption>Memory Allocated 256 MB &#8211; Duration Time 4999 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1457" height="237" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-512.png" alt="" class="wp-image-5389"/><figcaption>Memory Allocated 512 MB &#8211; Duration Time 2,426 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1450" height="233" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-1024.png" alt="" class="wp-image-5390"/><figcaption>Memory Allocated 1,024 MB &#8211; Duration Time 1,153 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1834" height="758" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-compare.png" alt="" class="wp-image-5391"/><figcaption>เทียบโค้ดชุดเดียวกัน แต่ใช้ Memory Allocate ต่างกันกัน</figcaption></figure>



<p>สังเกตได้ว่า ยิ่งเพิ่ม Memory Allocated มากเท่าไร ก็ยิ่งลดเวลา Cold Start ได้มากเป็นเท่าตัว</p>



<p>แต่วิธีการนี้อาจจะไม่ดี 100% กับทุกกรณี เช่น ทดสอบแสดงข้อความ &#8220;Hello World&#8221; ด้วยภาษา Javascript  ตามรูปด้านล่าง</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1347" height="643" src="https://myifew.com/wp-content/uploads/2019/05/aws-coldstart-js-by-memory.png" alt="" class="wp-image-5411"/><figcaption>Javascript แสดงข้อความ Hello Wold ที่จัดสรร Memory ต่างกัน แต่ผลออกมาแทบไม่ต่างกัน <br>(รูปอ้างอิงจาก <a href="https://mikhail.io/2018/08/serverless-cold-start-war/">mikhail.io</a>)</figcaption></figure>



<p>สังเกตว่า แม้เพิ่ม Memory Allocated ไปมากเท่าใด เวลาของ Cold Start ก็ไม่ต่างกันมากนัก และ Memory สูงที่สุด ก็ไม่ได้บ่งบอกว่าจะเร็วที่สุดด้วย ดังนั้นเราจึงควรหาวิธีอื่นเพื่อลด Cold Start แทน</p>



<p>ถ้าให้ผมแนะนำ กรณีเพิ่ม Memory Allocated นี้ เราไม่ควรจะคาดเดา ซึ่งผมเคยเขียนวิธีการทดสอบไว้แล้ว สามารถอ่านวิธีการได้ที่ <a rel="noreferrer noopener" aria-label="จัดสรรทรัพยากร AWS Lambda อย่างไร ให้ราคาถูกและเร็วที่สุด (opens in a new tab)" href="https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/" target="_blank">จัดสรรทรัพยากร AWS Lambda อย่างไร ให้ราคาถูกและเร็วที่สุด</a></p>



<h2 class="wp-block-heading" id="mce_24">2. Lean and Clean Code</h2>



<p>วิธีการนี้อาศัยทักษะทางเขียนโปรแกรมหน่อย คือการทำให้ Application เรากระชับที่สุด อะไรไม่ใช้ก็ตัดทิ้ง อะไรที่จำเป็นน้อย ทำให้ไม่จำเป็นเลยได้หรือไม่ อะไรเปลี่ยนวิธีได้ก็เปลี่ยน เช่น</p>



<p>การเรียกใช้ Config จาก JSON File วิธีนี้จะทำให้เราต้องเรียกใช้ Package Dependency จัดการไฟล์ JSON ต่างๆ ซึ่งเราสามารถย้ายไปใช้ Environment Variable แทนได้  ซึ่งถูกต้องตามหลัก <a href="https://myifew.com/5080/the-twelve-factors/">The Twelve Factors</a> ด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1894" height="408" src="https://myifew.com/wp-content/uploads/2019/05/lean-clean-config-in-environment-1.png" alt="" class="wp-image-5393"/><figcaption>Environment Variable ใน AWS Lambda</figcaption></figure>



<p>หรือการเรียกใช้ Package Dependency เกินความจำเป็น หรือไม่ได้ใช้แล้ว แต่ลืมลบ กรณีนี้เครื่องมือดีๆ สามารถช่วยเราได้ เช่น Visual Studio ที่จะทำการแจ้งเตือนให้เราลบตัวไม่ใช้ออก</p>



<p>ทั้งนี้ รวมไปถึงพวก Class, Function ต่างๆ ที่เขียนไว้ แต่ไม่ได้ใช้ ก็ต้องลบออกด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1184" height="332" src="https://myifew.com/wp-content/uploads/2019/05/lean-clean-delete-not-using-used.png" alt="" class="wp-image-5420"/><figcaption>Package อะไรไม่ใช้ ก็ลบออกไป</figcaption></figure>



<p>ยิ่งเราทำให้ขนาดโค้ดเราเล็กลงได้เท่าไร ก็ทำให้ไฟล์ที่แพ็คขึ้นสู่ AWS Lambda (Deployment Package File) เล็กลงตามเท่านั้น มันจะส่งผลเรื่อง Cold Start ที่ลดเวลาลงไปด้วย </p>



<p>ลองดูได้จากสถติของเว็บ <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a> ที่เขาใช้ Javascript ในการแสดงคำว่า &#8220;Hello World&#8221; แต่ทดลองเพิ่ม NPM packages เข้าไปใน Deployment Package File ด้วย </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1624" height="860" src="https://myifew.com/wp-content/uploads/2019/05/compare-cold-start-deployment-size.png" alt="" class="wp-image-5409"/><figcaption>เทียบเวลาการเกิด Cold Start เมื่อ Deployment Package (แบบ zip แล้ว) มีขนาดไฟล์ที่ใหญ่ขึ้น (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a> ) <br></figcaption></figure>



<p>ผลกระทบต่อมา ถ้าเราทำให้ Deployment Package File ใหญ่ขึ้น หมายถึงการทำให้ AWS Lambda Instances ใหญ่ขึ้นตามด้วย ถ้ามาถึงขั้นนี้แล้ว แม้จะเพิ่ม Memory เข้าไปช่วยเท่าไร ก็ไม่เห็นผลนะครับ เพราะ Cold Start ยังนานเหมือนเดิม แถมเสียเงินค่า Memory เพิ่มขึ้นด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1622" height="862" src="https://myifew.com/wp-content/uploads/2019/05/compare-cold-start-instance-size.png" alt="" class="wp-image-5410"/><figcaption>เมื่อ Instances Lambda เราใหญ่ การเพิ่ม Memory เข้าไป ดูจะไม่ข่วยทำให้เวลาในการ Cold Start ลดขึ้น แถมเสียเงินไปโดยเปล่าประโยชน์  (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a> ) </figcaption></figure>



<h2 class="wp-block-heading">3. ลด และ/หรือ เลือกใช้ Dependency ที่จำเป็นและเหมาะสม</h2>



<p>ข้อนี้จำเป็นต้อง Debug ให้เห็นรายละเอียดก่อน เพื่อประเมินว่าอะไรคือจุดที่ทำให้โค้ดเราทำงานช้า หรืออาจจะไปดูจาก Benchmark ที่มีผู้ทดสอบเปรียบเทียบ Package ต่างๆ เพื่อที่เราจะได้เลือกใช้ได้เหมาะสมตั้งแต่เริ่มพัฒนางาน</p>



<p>ปกติผมเขียน .NET Core ผมจะใช้ Entity Framework (EF) Core หรือ EF Core เพราะมันเหมือนชุดมาตรฐานที่ทำงานได้เข้ากันดี และมีเครื่องมือค่อนข้างครบ แต่ปรากฎว่า EF Core นี่เอง ทำให้ใช้เวลา Cold Start มากกว่าเดิมอย่างแสนสาหัส!! </p>



<p>ผมฝืนใช้มันอยู่นาน และไปหาทางแก้วิธีอื่นแทน จนกลับมาเอะใจตอนที่ Compile ว่า EF Core มันตัวใหญ่นี่หว่า ผมเลยลองเปลี่ยนไปใช้ ADO.NET หรือ Micro ORM อย่าง Dapper แทน ซึ่งผลปรากฎว่า เร็วขึ้นอีก 100% เลยทีเดียว </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2028" height="756" src="https://myifew.com/wp-content/uploads/2019/05/change-dependency-compare-128mb.png" alt="" class="wp-image-5401"/><figcaption>ผลเปรียบเทียบในการใช้ ADO.NET, Dapper, EF Core เพื่อเรียกข้อมูลจาก Database</figcaption></figure>



<p>เรื่องนี้คงไม่ขอเขียนเยอะ กราฟมันบอกชัดเจนอยู่แล้ว หากใครสนใจลองเอาไปเปรียบเทียบ สามารถดาวน์โหลดโค้ดของผมได้จากที่นี่ (ต้องใช้ .NET Core 3.0, MySQL)</p>



<ul class="wp-block-list"><li>ADO.NET &#8211; <a href="https://github.com/ifew/aws-lambda-db">https://github.com/ifew/aws-lambda-db</a></li><li>Dapper &#8211; <a href="https://github.com/ifew/aws-lambda-dapper">https://github.com/ifew/aws-lambda-dapper</a></li><li>Entity Framework (EF) Core &#8211; <a href="https://github.com/ifew/aws-lambda-efcore">https://github.com/ifew/aws-lambda-efcore</a></li></ul>



<p>กรณี Benchmark เทียบ Database Framework ดูเพิ่มเติมได้ที่</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="Dapper vs Entity Framework vs ADO.NET Performance Benchmarking (opens in a new tab)" href="https://exceptionnotfound.net/dapper-vs-entity-framework-vs-ado-net-performance-benchmarking/" target="_blank">Dapper vs Entity Framework vs ADO.NET Performance Benchmarking</a></li><li><a rel="noreferrer noopener" aria-label="Fetch performance of various .NET ORM / Data-access frameworks (opens in a new tab)" href="https://weblogs.asp.net/fbouma/fetch-performance-of-various-net-orm-data-access-frameworks" target="_blank">Fetch performance of various .NET ORM / Data-access frameworks</a></li><li><a href="https://koukia.ca/entity-framework-core-2-0-vs-dapper-net-performance-benchmark-querying-sql-azure-tables-7696e8e3ed28" target="_blank" rel="noreferrer noopener" aria-label="Entity Framework Core 2.0 vs. Dapper performance benchmark, querying SQL Azure tables (opens in a new tab)">Entity Framework Core 2.0 vs. Dapper performance benchmark, querying SQL Azure tables</a></li></ul>



<h2 class="wp-block-heading">4. Warm ตัว Server ของเราตลอดเวลา</h2>



<p>หากเรามีความจำเป็นต้องใช้ Lambda อยู่บ่อยๆ มีผู้เข้าใช้กระจัดกระจายแบบกำหนดเวลาไม่ได้ รู้แต่เข้าเมื่อไร ต้องเร็ว เช่น การแสดงรายการสินค้าของหน้าเว็บไซต์ E-Commerce เป็นต้น ถ้าสุดท้ายแล้วเราไม่สามารถแก้ไขโค้ดได้อีก หรือไม่อยากเพิ่ม Memory อีก เราก็ต้องทำให้ Server ของเราตื่นอยู่เสมอนั่นเอง</p>



<p>วิธีการคือ การตั้งเวลาให้มี Cronjob ไปเรียก (Ping) Server ของเราอยู่เรื่อยๆ อย่างเช่น AWS Lambda ที่ผมเจอ จะ Idle ทุกๆ 5 นาทีไปแล้ว ผมก็ต้องหา Cronjob ไปทำการ Invoke Lambda ประมาณนาทีที่ 5 เสมอ </p>



<p>วิธีการแบบนี้จะเปลือง Request มาก เพราะแปลว่า 1 วัน ผมจะต้องปลุกมัน 288 ครั้ง ถ้าครั้งหนึ่งต้องใช้เวลาประมวลผล (Duration Time) 2 วินาที และจอง Memory 512MB คิดดูว่าเดือนหนึ่งผมจะต้องเสียเงินไปเท่าไร</p>



<p>ซึ่งหากใครสนใจลองทำ วิธีนี้ค้นเจอได้ตามเว็บทั่วไป ส่วนมากจะใช้ CloudWatch ในการทำ ซึ่งผมไม่รู้ว่าทำไมถึงแนะนำให้ทำกันแบบนี้ แต่มันก็ไม่ผิดนะ ถ้าเหมาะสมกับรูปแบบงาน คือ ถ้าตัว Server เราถูกเรียกบ่อยทั้งวัน กอปรกับใช้เวลาประมวลผลไม่มาก ใช้ Memory ไม่สูง ก็อาจจะเหมาะสม</p>



<p>สามารถดูเพิ่มเติมได้ที่</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="How to Keep Your Lambda Functions Warm (opens in a new tab)" href="https://read.acloud.guru/how-to-keep-your-lambda-functions-warm-9d7e1aa6e2f0" target="_blank">How to Keep Your Lambda Functions Warm</a></li><li><a rel="noreferrer noopener" aria-label="Tutorial: Schedule AWS Lambda Functions Using CloudWatch Events (opens in a new tab)" href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html" target="_blank">Tutorial: Schedule AWS Lambda Functions Using CloudWatch Events</a></li><li><a rel="noreferrer noopener" aria-label="Lambda Warmer: Optimize AWS Lambda Function Cold Starts (opens in a new tab)" href="https://www.jeremydaly.com/lambda-warmer-optimize-aws-lambda-function-cold-starts/" target="_blank">Lambda Warmer: Optimize AWS Lambda Function Cold Starts</a></li><li><a href="https://github.com/jeremydaly/lambda-warmer">Lambda Warmer﻿</a></li></ul>



<h2 class="wp-block-heading">5. Warm ตัว Server ของเราตามเวลาที่เหมาะสม</h2>



<p>วิธีการนี้เหมือนกับข้อ 4 คือมี Conjob ไปเรียก (Ping) Server แต่ต่างกันที่ กำหนดเวลาในการเรียกให้ถี่มากน้อย ขึ้นกับการใช้งานจริง</p>



<p>เช่น 08:00-22:00 คนเข้าเว็บไซต์เยอะ ก็ให้เรียกทุก 5 นาที เพื่อให้ Instances ไม่เข้าโหมด Idle ส่วนเวลาตั้งแต่ 22:01-07:59 ให้เรียกทุก 10 นาที แทน เป็นต้น</p>



<p>หรือใคร Advance หน่อย ก็ทำสคริ้ปอัตโนมัติเพื่อ Edit Config Lambda ในช่วงเวลา 22:01-07:59 เพื่อปรับ  Memory ขึ้นไป แต่ไม่ต้องทำการ Ping ซึ่งมันก็จะไปใช้สูตรแบบข้อ 1. เพิ่ม Memory Allocated แทนการใช้แบบข้อ 4. เพื่อ Warm ตัว Server ตลอดเวลา</p>



<p>สามารถดูเพิ่มเติมได้ที่ </p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="AWS CLI - Modify the version-specific settings of a Lambda function  (opens in a new tab)" href="https://docs.aws.amazon.com/cli/latest/reference/lambda/update-function-configuration.html" target="_blank">AWS CLI &#8211; Modify the version-specific settings of a Lambda function </a></li><li><a rel="noreferrer noopener" aria-label="How to trigger aws lambda at different schedule every day (opens in a new tab)" href="https://stackoverflow.com/questions/53570401/how-to-trigger-aws-lambda-at-different-schedule-every-day" target="_blank">How to trigger aws lambda at different schedule every day</a></li></ul>



<h2 class="wp-block-heading">6. ใช้ Custom Runtimes และเลือกใช้ Runtimes ที่ทำงานได้เร็ว</h2>



<p>กรณีของผู้ให้บริการอย่าง Amazon ได้เพิ่มฟีเจอร์มาให้กับ AWS Lambda คือ การ  <a rel="noreferrer noopener" aria-label="Custom Runtimes (opens in a new tab)" href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html" target="_blank">Custom Runtimes</a> ได้เอง โดยไม่จำเป็นต้องใช้ตัวมาตรฐานที่ให้มา</p>



<p>ตัวอย่างเช่น .NET Core Runtime ที่ทาง Amazon มีมาให้คือ version 1.0 และ 2.1 เท่านั้น</p>



<p><strong>.NET Runtimes (ดูเพิ่มเติม ได้ที่ <a rel="noreferrer noopener" aria-label="AWS Lambda Runtimes (opens in a new tab)" href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" target="_blank">AWS Lambda Runtimes</a>)</strong></p>



<table class="wp-block-table"><tbody><tr><th>Name</th><th>Identifier</th><th>Languages</th><th>Operating System</th></tr><tr><td>.NET Core 2.1</td><td><code>dotnetcore2.1</code></td><td>C#PowerShell Core 6.0</td><td>Amazon Linux</td></tr><tr><td>.NET Core 1.0</td><td><code>dotnetcore1.0</code></td><td>C#</td><td>Amazon Linux</td></tr></tbody></table>



<p>แต่ปัจจุบันมี 2.2 และ 3.0 แล้ว ซึ่งถ้าเราพบว่า 3.0 ทำงานได้ดีกว่า หรือไวกว่า เราก็สามารถสร้าง Runtimes ขึ้นมาเองได้ หรืออาจจะไปสร้างเป็น <a href="https://aws.amazon.com/th/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/" target="_blank" rel="noreferrer noopener" aria-label="PHP Runtimes (opens in a new tab)">PHP Runtimes</a> ก็ยังได้ ถ้าเราอยากจะใช้ แต่ Amazon ไม่ได้ทำรองรับ</p>



<p>ในประเด็นนี้ ผมพยายามทดสอบหลายครั้ง ผมพบว่าใน .NET Core เมื่อทำ Custom Runtimes แล้ว ไม่ได้ช่วยทำให้ไวขึ้นแต่อย่างใด แถมช้าลงด้วย มีดีอย่างเดียวคือ ได้ใช้ฟีเจอร์ใหม่ๆ ในเวอร์ชั่นใหม่ (แต่ในภาษาอื่นๆ ถ้าใครทำดูแล้วได้ผลที่ดีขึ้น ลองมาแชร์กันได้ครับ)</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2534" height="1090" src="https://myifew.com/wp-content/uploads/2019/05/crt-netcore21.png" alt="" class="wp-image-5398"/><figcaption>.NET Core 2.1 Runtimes (ตัวมาตรฐานของ Amazon)</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2542" height="1092" src="https://myifew.com/wp-content/uploads/2019/05/crt-netcore30.png" alt="" class="wp-image-5399"/><figcaption>.NET Core 3.0 preview4 Runtimes (ตัว Custom Runtimes ที่ผมทำขึ้นมา)</figcaption></figure>



<p>สังเกตว่า ตัวมาตรฐาน .NET Core 2.1 Runtimes ทำงานได้ไวกว่าที่ผม Custom Runtimes เอง ที่เวอร์ชั่น 3.0 (แม้ว่าจริงๆแล้วผล <a href="https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/" target="_blank" rel="noreferrer noopener" aria-label="Benchmark ของ .NET Core 3.0 (opens in a new tab)">Benchmark ของ .NET Core 3.0</a> จะทำงานได้ไวกว่า 2.1 ในสภาพแวดล้อมที่ไม่ใช่ AWS Lambda ก็ตาม)</p>



<p>ใครอยากทดสอบ Custom Runtimes ลองดูโค้ดตัวอย่างที่ผมทำไว้ได้</p>



<ul class="wp-block-list"><li>.NET Core 3.0  &#8211; <a rel="noreferrer noopener" aria-label="https://github.com/ifew/aws-lambda-crt-example (opens in a new tab)" href="https://github.com/ifew/aws-lambda-crt-example" target="_blank">https://github.com/ifew/aws-lambda-crt-example</a></li><li>.NET Core 3.0 with ADO.NET &#8211; <a rel="noreferrer noopener" aria-label="https://github.com/ifew/aws-lambda-crt-db (opens in a new tab)" href="https://github.com/ifew/aws-lambda-crt-db" target="_blank">https://github.com/ifew/aws-lambda-crt-db</a></li><li>.NET Core 3.0 with Dapper &#8211; <a rel="noreferrer noopener" aria-label="https://github.com/ifew/aws-lambda-crt-db-dapper (opens in a new tab)" href="https://github.com/ifew/aws-lambda-crt-db-dapper" target="_blank">https://github.com/ifew/aws-lambda-crt-db-dapper</a></li></ul>



<p>เรื่อง Custom Runtimes สามารถศึกษาเพิ่มเติมได้ที่นี่ครับ</p>



<ul class="wp-block-list"><li><a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html">Custom AWS Lambda Runtimes</a></li><li><a href="https://medium.com/@zaccharles/benchmarking-lambdas-new-custom-runtime-for-net-core-43ea79b5a35a" target="_blank" rel="noreferrer noopener" aria-label="Benchmarking Lambda’s New Custom Runtime for .NET Core (opens in a new tab)">Benchmarking Lambda’s New Custom Runtime for .NET Core</a></li></ul>



<h2 class="wp-block-heading" id="mce_94">7. ใช้ Custom Runtimes และทำเป็น Native App</h2>



<p>แม้ว่าการทำ Custom Runtimes ผมจะไม่พอใจกับผลลัพธ์ที่เกิดขึ้น (กรณี C# .NET Core) แต่เราสามารถเอาวิธีการเดียวกันมาเรียกใช้ Binary Executable File แทนได้นะ ด้วยการทำโค้ดของเราให้เป็น Native Application ซะเลย </p>



<p>การแก้ไขปัญหาด้วยวิธีนี้ ผมภูมิใจนำเสนอมากๆๆๆ เรียกได้ว่า เป็นไม้ตาย ที่แก้ปัญหา Cold Start ได้อยู่หมัดจากทุกๆ วิธีที่ผมทำมาเลยทีเดียว แต่ก็ค่อนข้างทำยากและมีข้อจำกัดเยอะ</p>



<p>มาลองดูสถิติที่ผมทำบน C# .NET Core กัน ว่าผลแตกต่างแค่ไหน ซึ่งผมเทียบโดยใช้ Database Framework ต่างกัน 3 ตัว ที่ทำงานต่างกันบน Runtimes แบบปกติ (.NET Core 2.1), Custom Runtimes (.NET Core 3.0) และ Native (.NET Core  3.0 + CoreRT)</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2106" height="310" src="https://myifew.com/wp-content/uploads/2019/05/nativeapp-compare.png" alt="" class="wp-image-5402"/></figure>



<p>จากตาราง ตัว Lambda Native (ช่องสีเขียว) ชนะใสๆ แบบขาดรอย เพราะ Cold Start แค่ 1.3 วินาที ในขณะที่ตัวอื่นๆ ทำงานที่ 10-33 วินาที (เทียบกันที่ ADO.NET)</p>



<p>สังเกตว่าทำไมผมมี Lambda Native แค่ ADO.NET อย่างเดียว </p>



<p>เนื่องจาก Lambda Native ใช้ Runtimes ชื่อว่า CoreRT ซึ่งมันเป็น .NET Core runtime อีกตัวที่พัฒนามาเพื่อ AOT (ahead of time compilation) โดยเฉพาะ กล่าวคือ มันจะแปลงภาษาจาก High-Level Programming เช่น C#, Java ไปเป็นภาษาเครื่อง (Machine code) กันเลยทีเดียว</p>



<p>แต่ๆๆ เจ้าตัว CoreRT ยังไม่สมบูรณ์นัก และมีผู้ใช้งานไม่มาก หาข้อมูลได้ยาก จึงทำให้การพัฒนาได้ยากตาม รวมไปถึงหลายสิ่งยังไม่สามารถใช้งานได้ เช่น <a rel="noreferrer noopener" aria-label="เมื่อมีการเอา Dapper มาใช้ แต่โดนแจ้ง Error ว่า &quot;Operation is not supported on this platform&quot; (opens in a new tab)" href="https://github.com/dotnet/corert/issues/7386" target="_blank">เมื่อมีการเอา Dapper มาใช้ แต่โดนแจ้ง Error ว่า &#8220;Operation is not supported on this platform&#8221;</a> ด้วยเหตุผลนี้เอง ผมถึงบอกว่า ทำไมยังมีข้อจำกัดอยู่ และทำได้ยาก</p>



<p>ดูตัวอย่างที่ผมทำได้ที่นี่</p>



<ul class="wp-block-list"><li>Hello World &#8211; <a href="https://github.com/ifew/aws-lambda-lambdanative">https://github.com/ifew/aws-lambda-lambdanative</a></li><li>ADO.NET &#8211; <a href="https://github.com/ifew/aws-lambda-lambdanative-db">https://github.com/ifew/aws-lambda-lambdanative-db</a></li></ul>



<p>สามารถดูข้อมูลการทำ Lambda Native เพิ่มเติมได้ที่</p>



<ul class="wp-block-list"><li>LambdaNative &#8211; <a href="https://github.com/zaccharles/lambda-native">https://github.com/zaccharles/lambda-native</a></li><li>CoreRT &#8211; <a href="https://github.com/dotnet/corert">https://github.com/dotnet/corert</a></li></ul>



<h2 class="wp-block-heading">8. หลีกเลี่ยงการใช้ VPC ถ้าไม่จำเป็น</h2>



<p><strong>Update 6 Nov 2019</strong> &#8211; ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้ US West (N. California), EU (Ireland), EU (Paris), Asia Pacific (Mumbai), Asia Pacific (Seoul), Asia Pacific (Singapore), Asia Pacific (Sydney), and South America (San Paulo)    &#8211; ที่มา <a rel="noreferrer noopener" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a> </p>



<p><strong>Update 27 Sep 2019</strong> &#8211;  ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้  US East (Ohio), EU (Frankfurt), and Asia Pacific (Tokyo)  &#8211; ที่มา <a rel="noreferrer noopener" aria-label="aws.amazon.com (opens in a new tab)" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a></p>



<p style="text-align:center">&#8230;</p>



<p>คำแนะนำจาก <a rel="noreferrer noopener" aria-label="theburningmonk.com (opens in a new tab)" href="https://theburningmonk.com/2018/01/im-afraid-youre-thinking-about-aws-lambda-cold-starts-all-wrong/" target="_blank">theburningmonk.com</a> บอกว่า ควรหลีกเลี่ยง ถ้าไม่จำเป็น เพราะการใช้ VPC มันจะกำหนดให้ Lambda ต้องสร้าง ENIs ขึ้นมา (Elastic Network Interface) เพื่อใช้คุยกันภายใน VPC และในเว็บไซต์บอกว่า กระบวนการนี้มันจะทำให้เพิ่มเวลา Cold Start อีกประมาณ  10 วินาที!!</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1632" height="864" src="https://myifew.com/wp-content/uploads/2019/05/vpc-novpc-cold-start.png" alt="" class="wp-image-5406"/><figcaption>เทียบเวลาการเปิดใช้งาน AWS Lambda ตัวเดียวกัน แบบไม่มี VPC และมี VPC (รูปอ้างอิงจาก <a href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank" rel="noreferrer noopener" aria-label="mikhail.io (opens in a new tab)">mikhail.io</a>)</figcaption></figure>



<p>และในเว็บไซต์ <a href="https://epsagon.com/blog/aws-lambda-programming-language-comparison/">epsagon.com</a> ได้ให้ข้อมูลเพิ่มเติมว่า การกำหนด Memory ที่มากขึ้น ใน AWS Lambda ของภาษา C# , Java มันจะทำการสร้าง ENIs เพิ่มจำนวนขึ้นด้วย แม้ว่า AWS Lambda จะมีกระบวนการที่นำ ENIs เก่ามาใช้ใหม่ได้ก็ตาม โดยสังเกตได้จากสูตรที่ชี้แจงไว้ใน AWS Document</p>



<p>ดังนั้น สรุปได้คือ ถ้าเราใช้ VPS และยิ่งเพิ่ม Memory Allocate เข้าไปในตัว AWS Lambda มันก็จะยิ่งเพิ่ม ENIs ให้เหมาะสมกัน และจะส่งผลกับ Cold Start ที่ใช้เวลามากขึ้นตามไปด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1586" height="828" src="https://myifew.com/wp-content/uploads/2019/05/memory-related-enis.png" alt="" class="wp-image-5404"/><figcaption>การเพิ่ม Memory เพื่อรองรับ Capacity ที่มากขึ้น เท่ากับ  AWS Lambda จะต้องเพิ่มจำนวนการสร้าง ENIs ตามไปด้วย (รูปอ้างอิงจาก <a href="https://docs.aws.amazon.com/lambda/latest/dg/vpc.html">https://docs.aws.amazon.com/lambda/latest/dg/vpc.html</a>)<br></figcaption></figure>



<p>ปล. มีข่าวดีแว่วๆมา อ้างอิงจาก <a href="https://twitter.com/jeremy_daly/status/1068272580556087296">@jeremy_daly</a> ที่เข้าร่วมงาน AWS re:Invent ว่า AWS มีแผนจะแก้ปัญหาเรื่องนี้ภายในปี 2019 นี่แหละครับ</p>



<h2 class="wp-block-heading">9. เลือกภาษาเพื่อใช้ทำ Serverless ที่เหมาะสม</h2>



<p>ข้อสุดท้าย ถ้าไม่ผูกติดกับภาษาในการพัฒนา Serverless แนะนำให้ใช้ตระกูล Scripting Language แทน Compiled language จะช่วยแก้ปัญหา Cold Start ได้อย่างมาก</p>



<p>ลองดูจากสถิติของเว็บไซต์ <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1624" height="864" src="https://myifew.com/wp-content/uploads/2019/05/cold-start-per-language.png" alt="" class="wp-image-5408"/><figcaption>เทียบเวลาการเกิด Cold Start ในแต่ละภาษา (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a>)</figcaption></figure>



<p>พวก JavaScript, Python, Go, Java, และ Ruby จะทำงานเสร็จแถวๆ 500ms หรือไม่เกิน 800ms แต่สำหรับ C# จะใช้เวลาตั้งแต่ 0.8 จนถึง 5 วินาที เลยทีเดียว</p>



<p>ตัวอย่างสถิติอีกสักแห่ง จากเว็บไซต์ <a href="https://read.acloud.guru/does-coding-language-memory-or-package-size-affect-cold-starts-of-aws-lambda-a15e26d12c76">read.acloud.guru</a></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1796" height="1068" src="https://myifew.com/wp-content/uploads/2019/05/compare-cold-start-by-language.png" alt="" class="wp-image-5412"/><figcaption>เวลาเกิด Cold Start โดยเปรียบเทียบภาษาที่ใช้กับการจัดสรร Memory (รูปอ้างอิงจาก <a href="https://read.acloud.guru/does-coding-language-memory-or-package-size-affect-cold-starts-of-aws-lambda-a15e26d12c76">read.acloud.guru</a>)</figcaption></figure>



<p>สถิติจากเว็บไซต์นี้ ได้ผลใกล้เคียงกับที่แรกคือ พวก JavaScript, Python ยังคงทำงานได้เร็วแถวๆ 500ms ส่วน Java และ C# ใช้เวลา Cold Start นานมาก</p>



<p>และให้ข้อมูลเพิ่มเติมนิดนึงครับว่า แม้จะเปลี่ยนผู้ให้บริการ ก็ได้ผลไม่ต่างกัน ถ้าหากใครคิดว่า ใช้ C# บน Azure Function น่าจะเร็วกว่า AWS Lambda นั้น คิดผิดนะคร้าบบบ..</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1209" height="837" src="https://myifew.com/wp-content/uploads/2019/05/coldstart-per-language-vendor.png" alt="" class="wp-image-5413"/><figcaption>เทียบเวลาการเกิด Cold Start ในแต่ละภาษา และแต่ละผู้ให้บริการ (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a>)</figcaption></figure>



<p>ให้สังเกตว่า C# บน Azure Function ทำงานได้ช้ากว่า AWS Lambda ประมาณ 500ms &#8211; 1 วินาที เลยทีเดียว</p>



<p>อ่านข้อมูลการเปรียบเทียบเพิ่มเติมได้ที่นี่</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="Comparing AWS Lambda performance of Node.js, Python, Java, C# and Go (opens in a new tab)" href="https://read.acloud.guru/comparing-aws-lambda-performance-of-node-js-python-java-c-and-go-29c1163c2581" target="_blank">Comparing AWS Lambda performance of Node.js, Python, Java, C# and Go</a></li><li><a href="https://read.acloud.guru/does-coding-language-memory-or-package-size-affect-cold-starts-of-aws-lambda-a15e26d12c76" target="_blank" rel="noreferrer noopener" aria-label="How does language, memory and package size affect cold starts of AWS Lambda? (opens in a new tab)">How does language, memory and package size affect cold starts of AWS Lambda?</a></li></ul>



<h2 class="wp-block-heading">สรุป</h2>



<p>ตอนนี้เราก็คงต้องต่อสู่กับ Cold Start กันต่อไป เพราะเราไม่สามารถแก้ไขอะไรมันได้มากนัก ส่วนผู้ให้บริการเองอย่าง Amazon, Azure, Google Cloud ก็รู้ปัญหานี้เช่นกัน และพยายามปรับปรุงมันให้ดีขึ้นอยู่เรื่อยๆ แต่ที่สำคัญ ก่อนที่เราจะตัดสินใจใช้ Serverless เราต้องคิดให้ดีก่อนว่าเหมาะสมกับงานของเราแล้วหรือยัง</p>



<p>&#8212;</p>



<p>ที่มาภาพหน้าปก <a href="http://www.drunktiki.com/2016/08/17/yoda-pug/yoda-pug-jpg/">http://www.drunktiki.com/2016/08/17/yoda-pug/yoda-pug-jpg/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>จัดสรรทรัพยากร AWS Lambda อย่างไร ให้ราคาถูกและเร็วที่สุด</title>
		<link>https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/</link>
					<comments>https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 11 Apr 2019 12:08:16 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Performance Test]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[Testing Tools]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5339</guid>

					<description><![CDATA[เป็นคำถามที่ทุกคนอยากรู้ ว่าจะตั้งค่า Memory ใน AWS Lambda Function อย่างไรให้ราคาถูกสุด แต่ได้ความเร็วที่สุด แบบไม่ใช้ทรัพยากรเว่อร์เกินไป]]></description>
										<content:encoded><![CDATA[
<p>มาจัดเรื่อง AWS Lambda อีกสักโพสต์ (ก่อนที่ผมจะสลับไปเขียนเรื่องท่องเที่ยวบ้าง ฮ่าๆ) ซึ่งครั้งนี้ขอเขียนถึงวิธีการเลือกใช้ทรัพยากร อย่างเช่น Memory ให้เหมาะสมที่สุด ทำงานได้เร็วด้วย และต้องคุ้มค่ากับการจ่ายเงินด้วย </p>



<span id="more-5339"></span>



<p>ใน Slide ของ <a rel="noreferrer noopener" aria-label="Become a Serverless Black Belt (opens in a new tab)" href="https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks" target="_blank">Become a Serverless Black Belt</a> ได้พูดถึงเรื่องการจัดสรรทรัพยากรไว้หลายหน้า และในหน้าปิดท้ายของตอน ได้บอกไว้ว่า </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Dont&#8217;s Guestimate</p></blockquote>



<p>หมายถึง เรื่องพวกนี้ &#8220;อย่าไปเดา&#8221; นะหนู เพราะเราไม่สามารถรู้ได้เลยว่า โค้ดที่เราเขียน ใช้ Memory เท่าไร ดังนั้นจะต้องจัดสรรให้มันเท่าไรถึงจะเพียงพอ ซึ่งถ้าจัดให้มากไป ก็เสียเงินจับจองเมมโมรี่ (Allocated Memory) โดยเปล่าประโยชน์, และถ้าจัดให้น้อยไป ก็ใช้เวลาคำนวณนานขึ้น (Computed Time) ไม่ว่าจะทางใด ก็มีผลกับค่าใช้จ่ายที่เกิดขึ้นทั้งคู่.. ความสนุก Serverless มันอยู่ตรงนี้แหละ!!</p>



<h2 class="wp-block-heading">เลิกเดา แล้วมาคุยกันด้วยข้อมูลดีกว่า</h2>



<p>ใน Slide เรื่องเดียวกัน ได้อ้างถึงเครื่องมือตัวหนึ่ง ชื่อ <a rel="noreferrer noopener" aria-label="AWS Lambda Power Tuning (opens in a new tab)" href="https://github.com/alexcasalboni/aws-lambda-power-tuning" target="_blank">AWS Lambda Power Tuning</a> ที่พัฒนาโดย Alex Casalboni และเขาได้เล่าที่มาในบล็อก <a rel="noreferrer noopener" aria-label="AWS Lambda Power Tuning with AWS Step Functions (opens in a new tab)" href="https://serverless.com/blog/aws-lambda-power-tuning/" target="_blank">AWS Lambda Power Tuning with AWS Step Functions</a> ว่า Serverless Developer ทุกคนมักหลับหูหลับตาเพื่อจัดสรรทรัพยากร หรือไม่ก็ใช้วิธีการ Manual Test เพื่อทดสอบดูทีละแบบ ซึ่งมันก็เสียเวลาและไม่ได้ผลลัพธ์ที่ดีแน่นอน</p>



<p>พี่แกเลยบอกว่า ถ้าเช่นนั้นเรามาใช้วิธี Data-Driven ดีกว่า! แกเลยเริ่มจากทำ<a rel="noreferrer noopener" aria-label="โพลสำรวจใน Twitter (opens in a new tab)" href="https://twitter.com/alex_casalboni/status/854059283465383937" target="_blank">โพลสำรวจใน Twitter</a> ว่าสิ่งที่สังเกตเห็นมันเป็นจริงไหม</p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">How do you choose the optimal RAM configuration for your AWS Lambda Functions? I&#39;ll publish results &amp; my OSS project in a week! <a href="https://twitter.com/hashtag/serverless?src=hash&amp;ref_src=twsrc%5Etfw">#serverless</a></p>&mdash; Alex Casalboni (@alex_casalboni) <a href="https://twitter.com/alex_casalboni/status/854059283465383937?ref_src=twsrc%5Etfw">April 17, 2017</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<p>ซึ่งกว่า 50% ในโพล เคยใช้ Memory เท่าไรก็ตั้งไว้แบบเดิมเท่านั้น ไม่ได้สนใจที่จะ Tuning อะไร และครึ่งหนึ่งนิยมตั้งค่าไว้ที่ 128MB ทุก Function ด้วยเหตุผลที่ว่า เพราะมันราคาถูกที่สุดน่ะสิ! ไม่ได้สนใจเลยว่าจะทำงานได้ไวไหม</p>



<p>แต่ไม่ว่าจะเลือกตอบข้อไหน ก็ยังไม่ใช่สิ่งที่ควรทำในการตั้งค่า Memory ให้กับ Serverless อย่าง AWS Lambda</p>



<p>จากนั้นเขาก็เขียนเล่าถึงเหตุผลว่าทำไม Function ทำงานได้ช้า และคอนเซปของการแก้ปัญหาของ (ซึ่งถ้าใครอยากอ่านฉบับเต็ม ไปอ่านได้ที่ <a rel="noreferrer noopener" href="https://serverless.com/blog/aws-lambda-power-tuning/" target="_blank">AWS Lambda Power Tuning with AWS Step Functions) </a>จนสรุปได้ว่า การ Tuning Memory ทีละลำดับ พร้อมกับทดสอบเรียกใช้ (Invocating) ด้วยจำนวนที่ต้องการ ​กับ Lambda Function ทีละตัว คือหนทางที่เหมาะสม และต้องเป็นการทดสอบแบบ Automate ทั้งหมดด้วย เพื่อความรวดเร็ว  จึงเป็นที่มาของเครื่องมือ AWS Lambda Power Tuning ที่ผมกำลังจะเขียนถึง</p>



<h2 class="wp-block-heading">รู้จักกับ AWS Lambda Power Tuning</h2>



<p>เจ้าเครื่องมือ AWS Lambda Power Tuning นี้ ถูกพัฒนาด้วย Node.js โดยจะมี Lambda Function จำนวน 4 ตัว และเราต้องสร้าง Role กับ StepFunction เพื่อใช้มัน</p>



<p>แต่ไม่ต้องตกใจ ว่าจะยุ่งยาก เพราะโค้ดบน Github นาย Alex ได้มีไฟล์ Serverless.yml หรือเป็น AWS CloudFormation Script ไว้ให้เราใช้ Provision Infrastructure เรียบร้อย แต่เราจะต้องรันคำสั่งด้วยเครื่องมือชื่อ Serverless</p>



<p>การทำงานของมันคือ มันจะไปสร้าง Version ใน Lambda Function และกำหนด Memory ทีละช่วงที่เราต้องการ และทดสอบทีละ Version โดยจะหาค่าที่เหมาะสมที่สุดว่า ต้องใช้ Memory เท่าไร ที่สามารถ Compute ได้เร็วสุด และจ่ายเงินถูกที่สุด </p>



<p>ถ้าทำเอง น่าจะใช้เวลามากๆ เลยทีเดียว กว่าจะทดสอบ Lambda ได้ทีละตัว</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="648" height="956" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tunning-working.png" alt="" class="wp-image-5351"/></figure>



<h2 class="wp-block-heading" id="mce_25">ตัวอย่างผลลัพธ์ของ AWS Lambda Power Tuning</h2>



<p>เช่น ผมมี Lambda Function เพื่อแสดงรายการสินค้า 1 ตัว ผมต้องการรู้ว่า Memory ในช่วง 128 MB &#8211; 1024 MB จำนวนเท่าไรจะเหมาะสมที่สุด..</p>



<p>ตัว AWS Lambda Power Tuning ก็จะเรียก Function ของมันมาเรียงเป็น Step ทำงานให้เราดูเป็นกราฟ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2142" height="1234" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning.png" alt="" class="wp-image-5349"/></figure>



<p>เมื่อทำการทดสอบเสร็จ จะสรุปที่ Output ด้านขวามือ เพื่อบอกว่า ควรใช้ Power (Memory) เท่าไร ถึงจะคุ้มค่าที่สุด ด้วย Cost และ Duration Time เท่าไร</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2642" height="1250" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-monitoring-execution-1.png" alt="" class="wp-image-5361"/></figure>



<p>ถ้าใครอยากเห็นรายละเอียดการทดสอบแต่ละ Memory ให้เลื่อนลงมาดูด้านล่าง จะมี Output บอกอีกส่วนหนึ่งแบบละเอียด</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="914" height="1158" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-logs-detail.png" alt="" class="wp-image-5369"/></figure>



<p>คราวนี้ ทดสอบครั้งแรก ผมไม่ค่อยเชื่อผลเท่าไร จึงลองทดสอบทั้งหมด 4 รอบ, แต่ละรอบและแต่ละ Memory ผมจำลองให้มีการร้องขอ (Invocation) จำนวน 10 ครั้ง จำนวน 3 รอบ และ 100 ครั้ง จำนวน 1 รอบ ผลที่ได้ออกมา คือ</p>



<p><strong>Execution #1 &#8211; Invocation 10</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="898" height="404" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list1.png" alt="" class="wp-image-5346"/></figure>



<p><strong>Execution #2 &#8211; Invocation 10</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="862" height="408" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list3.png" alt="" class="wp-image-5348"/></figure>



<p><strong>Execution #3 &#8211; Invocation 10</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="860" height="408" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list2.png" alt="" class="wp-image-5347"/></figure>



<p><strong>Execution #4 &#8211; Invocation 100</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="902" height="406" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list4.png" alt="" class="wp-image-5350"/></figure>



<p>จากผลการทดสอบ แปลว่า Function แสดงรายการสินค้า ถ้าใช้ Memory ที่ 320 MB จะเร็วและถูกที่สุด โดยเราไม่จำเป็นต้องใช้ Memory ถึง 1024 MB ก็ได้ เพราะผลที่ได้อาจจะไม่ต่างกันมาก ไม่ว่าจะมีการเรียกใช้ 10 ครั้งหรือ 100 ครั้ง ต่อเนื่องก็ตาม </p>



<p>(อย่าลืมว่า ค่าใช้จ่ายการ Compute จะปัดเศษขึ้น เป็นหน่วย 100ms นะครับ ไม่ว่าจะ 40.2ms , 80.8ms ก็ถูกปัดไปคิดเงินเป็น 100ms เท่ากัน)</p>



<p>ปล. จุดสังเกต คือ Memory 256 MB จะทำงานได้ช้ากว่า และแพงกว่า ทั้ง 4 รอบเลย ตรงนี้ผมต้องไปตรวจสอบในระดับ Source Code, Logs, หรือใช้ AWS X-Ray ดูต่อว่าทำไม</p>



<h2 class="wp-block-heading" id="mce_57">วิธีการติดตั้ง AWS Lambda Power Tuning ผ่าน Serverless</h2>



<p class="has-background has-very-light-gray-background-color">** หากใครไม่สะดวกติดตั้งผ่าน Serverless สามารถทำด้วยการ Clone git แล้วรันสคริ้ป ซึ่งสามารถดูได้ที่ <a href="https://github.com/alexcasalboni/aws-lambda-power-tuning">https://github.com/alexcasalboni/aws-lambda-power-tuning</a> **</p>



<p>ขายของมานาน มาดูวิธีติดตั้งและใช้งานกัน ซึ่งในที่นี้ผมยกตัวอย่างของ MacOS, Linux  ส่วนชาว Windows ให้ใช้ PowerShell ดูนะครับ</p>



<h4 class="wp-block-heading">ความต้องการก่อนติดตั้งใช้งาน</h4>



<ol class="wp-block-list"><li>AWS Account จะต้องมีสิทธิ์ใช้งาน ดังนี้<ul><li>cloudformation:*</li><li>states:*</li><li>lambda:*</li><li>iam:CreateRole</li></ul></li><li>เครื่องที่ติดตั้งจะต้องมี npm (<a rel="noreferrer noopener" aria-label="วิธีติดตั้ง (opens in a new tab)" href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm" target="_blank">วิธีติดตั้ง npm</a>)</li></ol>



<h4 class="wp-block-heading">ติดตั้ง Serverless Framework และใส่ AWS credentials</h4>



<pre class="wp-block-code"><code>$ npm install serverless -g
$ serverless config credentials --provider aws --key XXX --secret YYY</code></pre>



<h4 class="wp-block-heading">ติดตั้ง AWS Lambda Power Tuning</h4>



<pre class="wp-block-code"><code>$ serverless install -u https://github.com/alexcasalboni/aws-lambda-power-tuning</code></pre>



<h4 class="wp-block-heading">ทำการติดตั้ง Package Dependency</h4>



<pre class="wp-block-code"><code>$ cd aws-lambda-power-tuning
$ npm install</code></pre>



<h4 class="wp-block-heading">สร้าง Config ของ State Machine ในไฟล์ serverless.yml</h4>



<pre class="wp-block-code"><code>$ npm run generate -- -A ACCOUNT_ID [-R eu-west-1] [-P 128,256,512,1024]

เช่น

$ npm run generate -- -A 182000046000 -R ap-southeast-1 -P 128,192,256,320,448,512,704,1024</code></pre>



<h4 class="wp-block-heading">ทำการ Deploy AWS Lambda Power Tuning</h4>



<pre class="wp-block-code"><code>$ serverless deploy</code></pre>



<h2 class="wp-block-heading" id="mce_66">วิธีการใช้งาน AWS Lambda Power Tuning</h2>



<p>เมื่อติดตั้งเสร็จแล้ว ลองเช็คที่ AWS Lambda Function เรา จะเจอฟังก์ชั่นเพิ่มขึ้นมา ดังนี้</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2582" height="340" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tunning-lambda-function.png" alt="" class="wp-image-5354"/></figure>



<p>จากนั้นให้ไปดูที่เซอร์วิส <a rel="noreferrer noopener" aria-label="Step Function (opens in a new tab)" href="https://console.aws.amazon.com/states/home" target="_blank">Step Function</a> จะพบ State Machine</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2790" height="714" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tuning-state-machine.png" alt="" class="wp-image-5355"/></figure>



<p>ให้กดที่ Start Excution</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2130" height="968" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tuning-state-machine-execute.png" alt="" class="wp-image-5356"/></figure>



<p>กรอกข้อมูล State Machine Input สำหรับจะใช้ทำงาน โดยมีรูปแบบตามนี้</p>



<pre class="wp-block-code"><code>{
    "lambdaARN": "your-lambda-function-arn",
    "num": 10
}</code></pre>



<p>เช่น</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2502" height="870" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tuning-state-machine-execute-input-1.png" alt="" class="wp-image-5358"/></figure>



<p>รอสักครู่ จะมี Status บอกเราว่า Successed พร้อมบอกรายละเอียดการทำงาน และผลลัพธ์ ซึ่งถ้ามันขึ้นว่า Failed ให้เราไปดูที่ Exception ได้ </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2642" height="1250" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-monitoring-execution-1.png" alt="" class="wp-image-5361"/></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2606" height="1256" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-monitoring-execution-detail.png" alt="" class="wp-image-5360"/></figure>



<h2 class="wp-block-heading">การกำหนดค่า State Machine Input</h2>



<p>เราสามารถกำหนด parameters ของ input ได้ ดังนี้:</p>



<ul class="wp-block-list"><li><strong>lambdaARN</strong> (จำเป็น): ARN ของ Lambda Function ที่ต้องการทดสอบ</li><li><strong>num</strong> (จำเป็น): หมายเลขจำนวนที่ต้องการทดสอบเรียกใช้งาน (invocations) ต่อครั้งและต่อ Memory ที่เรากำหนด (อย่างน้อย 5, แนะนำ: 10 &#8211; 100)</li><li><strong>payload</strong> (string/object): Input สำหรับใช้ใน Lambda Function ที่ต้องการทดสอบ (ใส่เป็นข้อมูล JSON)</li><li><strong>parallelInvocation</strong> (ค่าตั้งต้น: false): ถ้าเราใส่เป็น true, จะมีการเรียก Execute พร้อมๆ กัน ตามจำนวนที่เราระบุใน num</li></ul>



<h2 class="wp-block-heading">สรุป</h2>



<p>ไม่ยากเลยใช่ไหมครับ สามารถเอาไปใช้ตรวจสอบ AWS Lambda Fucntion ของเราเองได้อย่างรวดเร็วและสะดวก ไม่ต้องทำมือเองท่ีละตัว หรือใช้วิธีการเดา เพื่อความรวดเร็ว และคุ้มค่าที่สุด</p>



<p><strong>อ้างอิง</strong></p>



<ul class="wp-block-list"><li><a href="https://serverless.com/blog/aws-lambda-power-tuning/">https://serverless.com/blog/aws-lambda-power-tuning/</a></li><li><a rel="noreferrer noopener" aria-label="https://github.com/alexcasalboni/aws-lambda-power-tuning (opens in a new tab)" href="https://github.com/alexcasalboni/aws-lambda-power-tuning" target="_blank">https://github.com/alexcasalboni/aws-lambda-power-tuning</a></li><li><a rel="noreferrer noopener" aria-label="https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks (opens in a new tab)" href="https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks" target="_blank">https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ลองทำ Serverless WebSocket ด้วย AWS Lambda และ AWS API Gateway</title>
		<link>https://myifew.com/5321/real-time-applications-with-serverless-websockets-by-aws-lambda-and-api-gateway/</link>
					<comments>https://myifew.com/5321/real-time-applications-with-serverless-websockets-by-aws-lambda-and-api-gateway/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Wed, 27 Mar 2019 03:20:18 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[API Gateway]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[Websockets]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5321</guid>

					<description><![CDATA[แนวคิดการทำ WebSocket ด้วย Serverless ที่มันดูค่อนข้างขัดแย้งกัน แต่มันก็ทำได้นะ ด้วย AWS Lambda และ AWS API Gateway]]></description>
										<content:encoded><![CDATA[
<p>อยากอัพเดทข้อมูลแบบ Real-time, แสดงข้อความ Notification ทันทีเมื่อมีการแจ้งข่าวให้สมาชิก, ทำระบบแชทที่พูดคุยกันได้ตลอดเวลา ฯลฯ ระบบแบบนี้เรามักทำเป็น WebSocket ซึ่งเป็น Protocol หนึ่งที่จะเปิดท่อ Connection ไว้เพื่อให้สื่อสารระหว่าง Server  และ Client ได้ตลอดเวลา ซึ่งรายละเอียดมากกว่านี้ หรือทำอย่างไร ลองไปหาจาก Google ได้เยอะแยะ</p>



<p>แต่ที่ชวนฉงนคือ การทำงานของ Serverless เป็นแบบ เกิดขึ้น และทำ Process แล้วก็ดับไป มันจะทำเป็น WebSocket  ได้ด้วยหรอ เพราะต้องเปิดแช่ Connection เพื่อสื่อสารกันตลอดเวลา </p>



<p>โพสต์นี้จะแชร์แนวคิดให้อ่านกัน ว่ามันเป็นไปได้จริงๆ ด้วยบริการของ Amazon API Gateway และ AWS Lambda ส่วนโค้ดตัวอย่าง ไปดูได้ที่ Github (<a href="https://github.com/ifew/aws-lambda-websocket">aws-lambda-websocket</a>) ผมได้เลย</p>



<span id="more-5321"></span>



<h2 class="wp-block-heading">อธิบายการทำงาน</h2>



<p>การทำ Websocket ด้วย Lambda มีจุดสำคัญอยู่ 2 จุด คือ </p>



<h4 class="wp-block-heading"><strong>1.Amazon API Gateway</strong> </h4>



<p>ซึ่งทาง Amazon เอง เพิ่งประกาศฟีเจอร์ WebSocket นี้เมื่อ 3 เดือนที่แล้วนี่เอง (<a rel="noreferrer noopener" aria-label="18 ธันวาคม 2561 (opens in a new tab)" href="https://aws.amazon.com/th/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/" target="_blank">18 ธันวาคม 2561</a>) โดยสามารถใช้งานกับบริการต่างๆของ Amazon ได้ เช่น AWS Lambda, Amazon Kinesis, หรืออื่นๆที่เชื่อมต่อด้วย HTTP endpoint </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="928" height="571" src="https://myifew.com/wp-content/uploads/2019/03/api-gw-create-websockets.png" alt="" class="wp-image-5323"/><figcaption>หน้าตาของ Amazon API Gateway ตอนที่จะสร้าง WebSocket API</figcaption></figure>



<p>ซึ่งใน Amazon API Gateway ส่วนของ Websocket API จะมีการ Config Resource Type ต่างจากแบบ REST คือ </p>



<ol class="wp-block-list"><li><strong>route</strong> ที่เอาไว้เป็นช่องทางจัดการคำขอต่างๆที่มาจากผู้เรียกใช้ (route selection expression)</li><li><strong>routeKey</strong> ที่เป็นช่องทางของคำขอ โดยแบ่งได้ 3 routeKey หลัก คือ<ul><li><strong>$default</strong> &#8211; ใช้สำหรับคำขอที่ไม่เข้าเงื่อนไขใดๆเลย จากผู้รองขอ เช่น การส่งข้อมูล Error ให้กับผู้ร้องขอ</li><li><strong>$connect</strong> &#8211; ใช้สำหรับเมื่อมีผู้ร้องขอเพื่อขอใช้งาน และตรวจพบว่าเป็นการเรียกใช้ Websockets นี้ครั้งแรก (การที่เคยขอใช้ และ Connection ของ WebSocket หมดอายุไป ก็ต้องเรียก Connect ใหม่เช่นกัน)</li><li><strong>$disconnect</strong> &#8211; ใช้สำหรับบอกว่าผู้ใช้งานมีการ Disconnect จาก API ไปแล้ว ก็จะทำการตัด Connection ของ WebSocket ออกไปด้วย</li></ul></li></ol>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1219" height="636" src="https://myifew.com/wp-content/uploads/2019/03/api-gw-integrate-lambda.png" alt="" class="wp-image-5326"/></figure>



<h4 class="wp-block-heading"><strong>2.การเก็บ Connection ID ลง ฐานข้อมูล </strong></h4>



<p>โดยปกติถ้าเราเขียน WebSocket ทั่วไป มันจะทำการเก็บ Connection ID ไว้ใน Server แต่เมื่อเราทำบน Serverless อย่าง AWS Lambda ที่ธรรรมชาติของมันพร้อมจะปิดสวิตส์ตัวเองเสมอเมือ่ไม่ได้ใช้งานนานๆ เราจึงต้องเพิ่มการเก็บ Connection ID ลงในฐานข้อมูลแทน เพื่ออ้างอิงไว้ใช้ เมื่อ Lambda เราตื่นขึ้นมาทำงานต่อ</p>



<h2 class="wp-block-heading">ตัวอย่างการทำงาน AWS Lambda กับ WebSocket </h2>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="747" height="429" src="https://myifew.com/wp-content/uploads/2019/03/websockets-arch.png" alt="" class="wp-image-5325"/><figcaption>รูปจาก https://aws.amazon.com/th/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/</figcaption></figure>



<p>ในรูปตัวอย่าง อธิบายการทำงานของระบบ Chat ที่ใช้ Lambda และ WebSocket API โดยมีขั้นตอนคือ</p>



<ul class="wp-block-list"><li>ผู้ใช้ เข้ามาใช้งาน Chat Room ซึ่งระบบก็จะทำการ connect ไปที่ WebSocket API </li><li>ระบบ WebSocket API จะทำการสร้าง Connection ID และส่ง message กลับไปหาผู้ร้องขอตาม URL ที่มีการเรียกใช้มาตอนแรก (URL Callback) เพื่อบอกว่า  ทำการเชื่อมต่อสำเร็จ (Connected) พร้อมทั้งเก็บ Connection ID ไว้ในฐานข้อมูลด้วย</li><li>เมื่อผู้ใช้ส่งข้อความ Chat ไปให้ WebSocket API มันจะส่ง message นั้นไปที่ Reosource ที่เรากำหนดไว้ (ซึ่งในที่นี้คือ Lambda Function สำหรับการ Chat) โดยไม่ต้อง connect ใหม่อีกรอบ</li><li>message ที่ถูกส่งมา จะถูกกระจายส่งไปหา Connection ทุกคนที่มี Connection ID อยู่ในรายการฐานข้อมูล</li><li>สุดท้าย เมื่อพบว่าผู้ใช้ออกจากห้อง Chat Room ไปแล้ว ตัว WebSocket API จะ Disconnect ผู้ใช้คนนั้นอัตโนมัติ</li></ul>



<p>ผมทดลองโดยเปิด Connection ไว้ สามหน้าต่าง ซึ่งจะมี Connection ID ต่างกัน ดังนั้น เมื่อผมส่ง message ออกจากหน้าต่างไหนก็ตาม มันจะถูกเผยแพร่ไปหาหน้าต่างอื่นๆ ด้วย ดังนั้น จึงเหมาะกับงานประเภททำงานแบบ Realtime และ Broadcast เช่น Chat, Notification, Bidding หรือแม้แต่ระบบโหวตและนับคะแนนเสียงเลือกตั้ง </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2716" height="1648" src="https://myifew.com/wp-content/uploads/2019/03/Screen-Shot-2562-03-27-at-09.48.57.png" alt="" class="wp-image-5331"/><figcaption>ตัวอย่างการทำงานเพื่อคุยข้าม Connection กัน<br></figcaption></figure>



<p>ตัวอย่างโค้ด ดาวน์โหลดได้ที่ <a href="https://github.com/ifew/aws-lambda-websocket">https://github.com/ifew/aws-lambda-websocket</a></p>



<h2 class="wp-block-heading">ค่าใช้จ่าย สำหรับ AWS Lambda WebSocket </h2>



<p>ค่าใช้จ่ายในส่วนของ AWS Lambda จะเหมือนเดิม ตามที่เคยเขียนเล่าไว้ในบล็อก <a href="https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/">มาทำความรู้จักกับ Serverless และ AWS Lambda ฉบับคนคิดจะใช้</a> </p>



<p>จะมีที่แตกต่างคือการคิดเงินในฝั่งของ Amazon API Gateway ที่คิดตาม request และ จำนวนนาทีที่มีการเชื่อมต่ออยู่ สามารถดูได้จากตารางด้านล่าง</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="881" height="511" src="https://myifew.com/wp-content/uploads/2019/03/websockets-pricing.png" alt="" class="wp-image-5327"/></figure>



<p>ถามว่าแพงไหม ผมก็ไม่รู้นะ อยู่ที่การใช้งานของแต่ละระบบ แต่จำนวน request 1พันล้านแรก ราคา $1.15 กับ connection 1 ล้านนาที ราคา $0.288 คงเป็นตัวเลขที่ถูกแสนถูก มากๆ เท่ากับข้าวแกงจานนึง </p>



<p>แต่ตัวแปรสำคัญคงอยู่ที่ Lambda Compute ที่อาจจะแพง ฮ่าๆ เพราะ การทำงาน 1 ชุด จะมี Lambda อย่างน้อย 3 ตัวแน่นอน คือ Connect, Disconnect, Default ส่วน Lambda จะมีค่าใช้จ่ายสูงแค่ไหน ก็กลับไปดูจำนวน request และ compute time (วิธีคิดอ่านได้จากบล็อก <a href="https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/">มาทำความรู้จักกับ Serverless และ AWS Lambda ฉบับคนคิดจะใช้</a> )</p>



<h2 class="wp-block-heading">ข้อจำกัด</h2>



<ul class="wp-block-list"><li>รองรับผู้ใช้งานได้ 10,000 requests ต่อวินาที (RPS) ต่อ region (สามารถขอเพิ่มจากทาง Amazon ได้)</li><li>ระบบจะทำการเพิ่มให้ 500 requests ในทุกๆวินาที ต่อ region</li><li>ส่งข้อมูลผ่าน WebSocket (frame size) ได้ไม่เกิน 32 KB ถ้าต้องใช้มากกว่านั้น ต้องตัดข้อมูลเป็นเฟรมๆเพื่อส่ง, ซึ่งถ้าส่งเกิน ระบบจะทำการ Disconnect อัตโนมัติ</li><li>ระยะเวลาสำหรับ Connection อยู่ได้ 2 ชั่วโมง</li><li>เข้าสู่โหมด Idle Connection Timeout ที่เวลา 10 นาที กรณีไม่มีการส่งข้อมูลอะไรผ่าน WebSocket API</li><li>สามารถทำ AWS Lambda authorizers ต่อ API ได้ 10 ตัว (สามารถขอเพิ่มจากทาง Amazon ได้)</li><li>สร้าง Routes ต่อ API ได้ไม่เกิน 300 ตัว (สามารถขอเพิ่มจากทาง Amazon ได้) </li><li>ทำการเชื่อมต่อ API กับ Resource ต่างๆ เช่น AWS Lambda (Integrations) ได้ไม่เกิน 300 ตัว (สามารถขอเพิ่มจากทาง Amazon ได้)</li><li>สามารถมี Stages ต่อ API ได้ไม่เกิน 10 ตัว (สามารถขอเพิ่มจากทาง Amazon ได้)</li></ul>



<h2 class="wp-block-heading">สรุป</h2>



<p>น่าสนใจมากๆ สำหรับการทำ WebSocket ด้วย Serverless ดูเป็นเรื่องน่าสนุกดีสำหรับผม  เหมือนได้เล่นของใหม่ ที่พยายามพลิกแพลง Serverless มาทำ แต่ถามว่าดีหรือไม่ เหมาะสมไหม ตอนนี้มันยังใหม่มาก หาเคสตัวอย่างใหญ่ๆ ไม่เจอ (หรืออาจจะมีแต่ไม่มีใครเปิดเผย) ดังนั้นถ้าให้บอกข้อดีที่นึกออกตอนนี้ ก็คงเรื่องของราคาค่า Server ที่มันถูกลง ตาม benefit เดิมของ Serverless นั่นแหละ, ส่วนข้อเสียที่ผมพบตอนนี้ รู้สึกทดสอบยาก ณ ตอนเขียนบล็อกนี้ยังนึกการทำ Integration Test ไม่ออกเลย นอกจากการ Deploy ขึ้นไปทดสอบบน AWS เอง, หากใครคิดออก หรือมีตัวอย่างเจ๋งๆ ก็แชร์กันได้นะครับ</p>



<p><strong>อ้างอิง</strong></p>



<ul class="wp-block-list"><li><a href="https://aws.amazon.com/th/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/">https://aws.amazon.com/th/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/</a></li><li>รูปปกจาก <a href="https://blog.stanko.io/do-you-really-need-websockets-343aed40aa9b?gi=77181225da63">https://blog.stanko.io/do-you-really-need-websockets-343aed40aa9b?gi=77181225da63</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5321/real-time-applications-with-serverless-websockets-by-aws-lambda-and-api-gateway/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>มาทำความรู้จักกับ Serverless และ AWS Lambda ฉบับคนคิดจะใช้</title>
		<link>https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/</link>
					<comments>https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Wed, 27 Feb 2019 11:56:43 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5166</guid>

					<description><![CDATA[อธิบาย ความเป็นมาของ Serverless และ AWS Lambda คืออะไร ดีอย่างไร เพื่อให้คนไม่รู้จักและคนที่ไม่ใช่ IT ได้เข้าใจง่ายๆ ]]></description>
										<content:encoded><![CDATA[
<p>ผมได้ยินกิตติศัพท์ <strong>AWS Lambda</strong> มานานมาก แต่ไม่เคยเข้าไปดูจริงจัง รู้แค่มันเป็น Service ที่มีไว้ทำ Process สักอย่าง เมื่อเสร็จแล้วก็ทำลายตัวเองทิ้งไป คิดเงินตามการเรียกใช้และระยะเวลาที่ใช้ทำงานเท่านั้น หรือที่เรียกกันว่า <strong>Serverless</strong> </p>



<p>ช่วงนี้ได้มีโอกาสเล่นมันแบบจริงๆจังๆ เลยรู้สึกว่า คนต้นคิดเรื่อง Serverless เจ๋งดี เลยอยากมาเขียนสรุปให้อ่านกันสำหรับคนที่ไม่รู้อะไรเลย ผ่านตัวอย่างบริการของ AWS Lambda</p>



<span id="more-5166"></span>



<h2 class="wp-block-heading">Serverless คืออะไร?</h2>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="675" src="https://myifew.com/wp-content/uploads/2019/02/evolution-of-serverless-1200x675.png" alt="" class="wp-image-5285" srcset="https://myifew.com/wp-content/uploads/2019/02/evolution-of-serverless-1200x675.png 1200w, https://myifew.com/wp-content/uploads/2019/02/evolution-of-serverless-1024x576.png 1024w, https://myifew.com/wp-content/uploads/2019/02/evolution-of-serverless-768x432.png 768w, https://myifew.com/wp-content/uploads/2019/02/evolution-of-serverless-700x394.png 700w, https://myifew.com/wp-content/uploads/2019/02/evolution-of-serverless-600x338.png 600w, https://myifew.com/wp-content/uploads/2019/02/evolution-of-serverless.png 1510w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: <a href="https://www.youtube.com/watch?v=3vaqTIIcfvY">https://www.youtube.com/watch?v=3vaqTIIcfvY</a></figcaption></figure>



<p>Serverless ถ้าแปลตรงตัวก็คงเรียกว่า &#8220;ไม่มี Server&#8221; กล่าวคือ เมื่อมีการเรียกใช้งานอะไรสักอย่าง มันจะสร้าง Server ชั่วคราวขึ้นมาเพื่อประมวลผล และเมื่อส่งผลลัพธ์ให้เราเสร็จ มันก็จะหยุดทำงาน หรือทำลายตัวเองทิ้งไป </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><em>ปล. จริงๆ มันก็มี Server นั่นเอง ผมอยากแปลมันว่า &#8220;Server ชั่วคราว&#8221; มากกว่า แต่เพื่อความเข้าใจตรงกันขอใช้คำแปลแบบท่านอื่นๆแล้วกัน เพราะส่วนตัวคิดว่า คำว่า &#8220;Serverless ทำงานแบบไร้ Server&#8221; มันเป็นข้อความทางการตลาด ให้คนสนใจ แต่ค่อนข้างสร้างความสับสนว่าเป็นไปได้ด้วยหรอ?!</em></p><cite>iFew</cite></blockquote>



<p>ถ้าไล่ประวัติตามรูปด้านบน เริ่มต้นมาจากสมัย Internet มาแรกๆ ที่เราต้องตั้งเครื่อง Server ทีละตัว หรือหลายๆเครื่องตามปริมาณที่รองรับคนได้ ต้องดูแลเองทุกอย่าง </p>



<p>จนถึงวันหนึ่งที่อุปกรณ์ต่างๆ เริ่มมีราคาถูกลงและสเปกแรงขึ้น เราจึงประหยัดต้นทุนด้วยการจำลอง Server หลายๆตัว ลงในเครื่อง Server ตัวเดียว หรือที่เรียกกันว่า VM (Virtual Machine) </p>



<p>และเมื่อ Internet เร็วและแรงขึ้น ก็ได้เกิดบริการที่เรียกว่า Cloud Computer ซึ่งใน Cloud เองก็ใช้สถาปัตยกรรมหลายรูปแบบแล้วแต่ผู้ให้บริการ จนมาถึงยุคปัจจุบัน ที่กำลังอยู่ในช่วงของความนิยมใช้ Container อย่างเข่น Docker, Kubernates และก็กำลังก้าวเข้าสู่ยุค Serverless ที่ผมกำลังจะเล่าถึง</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="911" src="https://myifew.com/wp-content/uploads/2019/02/infoq-trend-report-feb2019-1200x911.jpg" alt="" class="wp-image-5303" srcset="https://myifew.com/wp-content/uploads/2019/02/infoq-trend-report-feb2019-1200x911.jpg 1200w, https://myifew.com/wp-content/uploads/2019/02/infoq-trend-report-feb2019-1024x777.jpg 1024w, https://myifew.com/wp-content/uploads/2019/02/infoq-trend-report-feb2019-768x583.jpg 768w, https://myifew.com/wp-content/uploads/2019/02/infoq-trend-report-feb2019-700x531.jpg 700w, https://myifew.com/wp-content/uploads/2019/02/infoq-trend-report-feb2019-600x455.jpg 600w, https://myifew.com/wp-content/uploads/2019/02/infoq-trend-report-feb2019.jpg 1800w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: https://www.infoq.com/articles/devops-cloud-trends-2019</figcaption></figure>



<p>สังเกตไหมครับว่า อะไรที่เปลี่ยนไป?&#8230;</p>



<p>สิ่งที่เปลี่ยนไปคือ สิ่งที่เราใช้ประมวลผลมันเล็กลงเรื่อยๆ จากเครื่อง Server ย่อยลงมาเหลือแค่ระดับ VM มาเป็น Container รวมถึงการจัดการเรื่องเหล่านี้ก็ถูกผลักไปให้ทางผู้ให้บริการดูแลมากขึ้น จากที่ต้องดูแลเรื่อง Hardware + Network + Middleware + Application  ก็เหลือเพียงแค่โฟกัสเรื่อง Application อย่างเดียว (ส่วน SaaS มันคือการไปใช้ระบบของคนอื่นเลย ไม่ต้องทำเอง ไม่ต้องดูแล)</p>



<p>ซึ่ง ผมไม่รู้ว่าใครเริ่มก่อนกัน ระหว่าง Hardware กับ Software แต่มันสอดคล้องกับแนวโน้มการพัฒนา Software ที่นิยมย่อยชิ้นส่วนให้เล็กลง แบบที่เราคุ้นชื่อกันตอนนี้ เช่น Microservice ที่เกิดมาเพื่อลดข้อผิดพลาดที่เป็นผลพวงจากการทำงานที่เกี่ยวข้องกัน รวมถึงจัดการทรัพยากรให้เหมาะสม และก็ลากไปเกี่ยวโยงอีกว่า เพื่อรองรับกับวิธีบริหารจัดการในแบบ Interative and Incremental อย่าง Scrum, DSDM, XP เป็นต้น</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="551" src="https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-1200x551.jpeg" alt="" class="wp-image-5284" srcset="https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-1200x551.jpeg 1200w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-1024x470.jpeg 1024w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-768x352.jpeg 768w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-700x321.jpeg 700w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-600x275.jpeg 600w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ.jpeg 1600w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: <br><a href="https://medium.com/@sdorzak/why-serverless-is-the-new-black-e4ff9e9947e0">https://medium.com/@sdorzak/why-serverless-is-the-new-black-e4ff9e9947e0</a> <br></figcaption></figure>



<p>และเมื่อมันไม่มี Server ให้เราจัดการและดูแล ก็จะเป็นหน้าที่ของผู้ให้บริการ Serverless ต่างๆ ที่จะทำแทนเรา โดยมันจะมีการขยายตัว (Scale out) หดตัว (Scale down) เพื่อจัดทรัพยากรย์ต่างๆ ให้รองรับปริมาณการทำงานตามความเหมาะสมแบบอัตโนมัติ และคิดค่าใช้จ่ายตามการใช้งานจริง</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="667" src="https://myifew.com/wp-content/uploads/2019/02/lambda-memory-timeout-1200x667.png" alt="" class="wp-image-5299" srcset="https://myifew.com/wp-content/uploads/2019/02/lambda-memory-timeout-1200x667.png 1200w, https://myifew.com/wp-content/uploads/2019/02/lambda-memory-timeout-1024x569.png 1024w, https://myifew.com/wp-content/uploads/2019/02/lambda-memory-timeout-768x427.png 768w, https://myifew.com/wp-content/uploads/2019/02/lambda-memory-timeout-700x389.png 700w, https://myifew.com/wp-content/uploads/2019/02/lambda-memory-timeout-600x333.png 600w, https://myifew.com/wp-content/uploads/2019/02/lambda-memory-timeout.png 1292w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ใน AWS Lambda เราจัดสรรทรัพยากรได้แค่ Memory กับกำหนด Timeout ได้ เพราะสองเรื่องนี้จะมีผลกับค่าใช้จ่ายโดยตรง</figcaption></figure>



<h2 class="wp-block-heading">AWS L<g class="gr_ gr_5 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="5" data-gr-id="5">ambda</g> คืออะไร?</h2>



<p>เป็น Serverless Platform ที่สร้างโดย Amazon ตั้งแต่ November 2014 โดยมีรูปแบบเป็น FaaS (Function-as-a-Service) หรือว่าง่ายๆ คือ Lambda 1 ตัวที่ถูกสร้างชั่วคราวเพื่อมาใช้งาน จะมีเพียง 1 Function หรือหนึ่งการทำงานเท่านั้น (ประมาณว่า Server 1 ตัว เก็บแค่ 1 Function)</p>



<p>และมันได้ออกแบบมาเป็น EDA (Event-driven architecture) คือ ต้องมี Event Trigger ไปเรียกมันขึ้นมาใช้งาน ไม่สามารถทำงานได้ด้วยตัวเอง</p>



<p>ตอนนี้รองรับภาษายอดนิยม อย่าง Node.js, Python, Java, Go, Ruby และ C# (.NET Core) และถ้าใครใช้ PHP แม้จะยังไม่รองรับ แต่ก็สามารถทำ <a href="https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/" target="_blank" rel="noreferrer noopener" aria-label="PHP Custom Runtime (opens in a new tab)">PHP Custom Runtime</a> เองได้</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="555" src="https://myifew.com/wp-content/uploads/2019/02/working-with-lambda-1200x555.png" alt="" class="wp-image-5293" srcset="https://myifew.com/wp-content/uploads/2019/02/working-with-lambda-1200x555.png 1200w, https://myifew.com/wp-content/uploads/2019/02/working-with-lambda-1024x474.png 1024w, https://myifew.com/wp-content/uploads/2019/02/working-with-lambda-768x355.png 768w, https://myifew.com/wp-content/uploads/2019/02/working-with-lambda-700x324.png 700w, https://myifew.com/wp-content/uploads/2019/02/working-with-lambda-600x278.png 600w, https://myifew.com/wp-content/uploads/2019/02/working-with-lambda.png 1522w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: <br><a href="https://www.slideshare.net/AmazonWebServices/deep-dive-on-aws-lambda">https://www.slideshare.net/AmazonWebServices/deep-dive-on-aws-lambda</a></figcaption></figure>



<p>รายละเอียดอื่นๆ ไปดูเพิ่มเติมได้ที่ <a rel="noreferrer noopener" aria-label="https://aws.amazon.com/lambda/ (opens in a new tab)" href="https://aws.amazon.com/lambda/" target="_blank">https://aws.amazon.com/lambda/</a> ครับ</p>



<h2 class="wp-block-heading">Serverless ทำงานอย่างไร?</h2>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="526" src="https://myifew.com/wp-content/uploads/2019/02/serverless-request-1200x526.png" alt="" class="wp-image-5289" srcset="https://myifew.com/wp-content/uploads/2019/02/serverless-request-1200x526.png 1200w, https://myifew.com/wp-content/uploads/2019/02/serverless-request-1024x448.png 1024w, https://myifew.com/wp-content/uploads/2019/02/serverless-request-768x336.png 768w, https://myifew.com/wp-content/uploads/2019/02/serverless-request-700x307.png 700w, https://myifew.com/wp-content/uploads/2019/02/serverless-request-600x263.png 600w, https://myifew.com/wp-content/uploads/2019/02/serverless-request.png 1498w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: <br><a href="https://medium.com/@chrishantha/ballerina-services-in-serverless-world-b54c5e7382a0">https://medium.com/@chrishantha/ballerina-services-in-serverless-world-b54c5e7382a0</a> <br></figcaption></figure>



<p>ตามที่เกริ่นไปก่อนหน้า เมื่อมันไม่มี Server เปิดทิ้งไว้ มันจึงต้องมีอะไรบางอย่างไปสะกิดเพื่อปลุกมันให้ตื่น (หรือที่เรียกว่า Event Trigger) โดยส่วนมากแล้วก็ถูกนำไปใช้กับ API Gateway เพื่อทำเป็น API Backend </p>



<p>โดยเมื่อมีใครเรียกใช้มัน มันก็จะสร้าง Server (หรือเรียกว่า Instant) ขึ้นมาเพื่อประมวลผลอะไรบางอย่าง และส่งผลลัพธ์ให้เรา และเมื่อไม่ได้ใช้บริการมันในระยะเวลาหนึ่ง มันจะกลับไปหลับเหมือนเดิม (หรือเรียกว่า Idle, Sleep) เพื่อรอการเรียกอีกครั้ง ซึ่งในขณะที่มันหลับอยู่ก็จะไม่คิดค่าบริการกับเรา</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="668" src="https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-1200x668.png" alt="" class="wp-image-5287" srcset="https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-1200x668.png 1200w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-1024x570.png 1024w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-768x427.png 768w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-700x390.png 700w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-600x334.png 600w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle.png 1258w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: myifew.com &#8211; อธิบายการทำงาน Lambda Life Cycle<br></figcaption></figure>



<p>ลงในรายละเอียดอีกนิด และสำคัญมากๆ คือ ตอนมัน Initial เพื่อสร้าง Server ขึ้นมา มันจะโหลดโค้ดของเรา และทำการติดตั้งนั่นโน่นนี่ และรันโค้ดของเราเพื่อมาทำงาน </p>



<p>ที่มันสร้างและติดตั้งต่างๆนี่เอง เรียกว่าช่วง Cold Start  ผมให้ข้อสังเกตว่า ตรงนี้เป็นปัญหาหนึ่งที่ทำให้กินเวลาการประมวลผลเพิ่มขึ้น แต่จะเกิดกับครั้งแรกที่รันเท่านั้น พอรันซ้ำอีกครั้ง ในเวลาไล่เลี่ยกัน (หรือก่อนที่มันจะหลับ) มันจะ execute code อย่างเดียว ก็จะทำให้เร็วตามที่โค้ดเราทำงานจริงๆ </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1194" height="672" src="https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-condition.png" alt="" class="wp-image-5288" srcset="https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-condition.png 1194w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-condition-1024x576.png 1024w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-condition-768x432.png 768w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-condition-700x394.png 700w, https://myifew.com/wp-content/uploads/2019/02/serverless-lifecycle-condition-600x338.png 600w" sizes="auto, (max-width: 1194px) 100vw, 1194px" /><figcaption>ภาพจาก: <br><a href="https://www.slideshare.net/AmazonWebServices/srv310designing-microservices-with-serverless">https://www.slideshare.net/AmazonWebServices/srv310designing-microservices-with-serverless</a> <br></figcaption></figure>



<p>ถามว่า Cold Start กินเวลานานขนาดไหน ต้องบอกว่าเป็นหลักวินาที ยิ่งโค้ดใหญ่มาก จัดสรร Memory ให้น้อย ก็ยิ่งใช้เวลานาน ตรงนี้เป็นจุดหนึ่งที่ต้องคิดเยอะๆ เพราะมีผลกับผู้ใช้งานคนแรก และค่าใช้จ่ายที่ตามมา</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><em>ปล. ผมโดนถามบ่อยๆว่า นานแค่ไหนที่ Server จะเข้าสู่โหมด Idle? จากที่เจอเอง ใช้ Server Singapore ผมลุกไปเข้าห้องน้ำ 5-10 นาที กลับมาก็รู้สึกช้าแล้วครับ แต่กับที่ไปหาอ่านของฝรั่ง น่าจะใช้ Server ทวีปอื่น บางคนบอก 15 นาที บางคนบอก 45 นาที ผมจึงเชื่อว่าทวีปน่าจะมีผลกับเวลา Idle</em></p><cite>iFew</cite></blockquote>



<h2 class="wp-block-heading">การทำงานแบบ Continuous Scaling</h2>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="629" src="https://myifew.com/wp-content/uploads/2019/02/continuous-scaling-1200x629.png" alt="" class="wp-image-5290" srcset="https://myifew.com/wp-content/uploads/2019/02/continuous-scaling-1200x629.png 1200w, https://myifew.com/wp-content/uploads/2019/02/continuous-scaling-1024x537.png 1024w, https://myifew.com/wp-content/uploads/2019/02/continuous-scaling-768x403.png 768w, https://myifew.com/wp-content/uploads/2019/02/continuous-scaling-700x367.png 700w, https://myifew.com/wp-content/uploads/2019/02/continuous-scaling-600x315.png 600w, https://myifew.com/wp-content/uploads/2019/02/continuous-scaling.png 1648w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: myifew.com</figcaption></figure>



<p>สั่งเกตว่าใช้คำว่า Continuous Scaling ไม่ใช่ Auto Scaling แบบที่เคยทำกับ Cloud ทั่วไป แล้วมันทำงานอย่างไรล่ะ?</p>



<p>อ้างอิงจากเอกสาร <a rel="noreferrer noopener" aria-label="Understanding Scaling Behavior (opens in a new tab)" href="https://docs.aws.amazon.com/lambda/latest/dg/scaling.html" target="_blank">Understanding Scaling Behavior</a> ของ Amazon ได้บอกไว้ว่า AWS Lambda มีการ Initial ครั้งแรกก็จะรองรับ Concurrency ได้จำนวนหนึ่ง แต่จะแตกต่างกันตามแต่ละทวีปที่เราใช้บริการ </p>



<p>เช่น ผมเลือกใช้ของ Singapore ดังนั้นการสร้าง Server ขึ้นมาครั้งแรก มันจะรองรับ Concurrency ที่ 500 และถ้ามีปริมาณผู้ใช้มากขึ้นเรื่อยๆ มันจะทำการเพิ่ม Concurrency ให้ครั้งละ 500 ในทุกๆ 1 นาที จนกว่าจะชนเพดาน Limit ที่เรามี (ซึ่งในภาพตัวอย่าง คือ รองรับได้ที่ 1,000 Concurrency พร้อมกัน ซึ่งทุกคนจะได้ค่ามาตรฐานเป็นเท่านี้ ยกเว้นไปอีเมลขอปริมาณเพิ่มจากทาง Amazon)</p>



<p>โดย Concurrency ทั้งหมดที่เรามีนั้น  Amazon จะกระจายให้กับทุก Function ตามการใช้งานจริง เช่น Function A มีการเรียกใช้ 125 Concurrency จะทำให้ Function อื่นๆ ทั้งหมดแย่งกันใช้จาก 875 Concurrency ที่เหลือ ดังนั้น Amazon จึงมีฟีเจอร์ให้เราจอง Concurrency ให้กับ Function ได้ว่า ต้องมีเหลือให้ใช้เสมอ ในจำนวนเท่าไร</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="534" src="https://myifew.com/wp-content/uploads/2019/02/control-concurrency-1200x534.png" alt="" class="wp-image-5292" srcset="https://myifew.com/wp-content/uploads/2019/02/control-concurrency-1200x534.png 1200w, https://myifew.com/wp-content/uploads/2019/02/control-concurrency-1024x456.png 1024w, https://myifew.com/wp-content/uploads/2019/02/control-concurrency-768x342.png 768w, https://myifew.com/wp-content/uploads/2019/02/control-concurrency-700x312.png 700w, https://myifew.com/wp-content/uploads/2019/02/control-concurrency-600x267.png 600w, https://myifew.com/wp-content/uploads/2019/02/control-concurrency.png 1666w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: myifew.com</figcaption></figure>



<p>รวมไปถึง หากพบว่ามีการประมวลผลแปลกๆ ทำงานนานผิดปกติ หรือพบว่ามีการ Reuqest มากผิดปกติ ซึ่งจะส่งผลกับค่าใช้จ่ายที่มากขึ้น เราสามารถปิดการทำงานชั่วคราวได้ด้วยการลด  Concurrency ให้เหลือศูนย์ (Throttle)</p>



<h2 class="wp-block-heading" id="mce_30">Serverless เอาไปใช้งานใดได้บ้าง?</h2>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="554" src="https://myifew.com/wp-content/uploads/2019/02/serverless-use-case-1200x554.png" alt="" class="wp-image-5296" srcset="https://myifew.com/wp-content/uploads/2019/02/serverless-use-case-1200x554.png 1200w, https://myifew.com/wp-content/uploads/2019/02/serverless-use-case-1024x473.png 1024w, https://myifew.com/wp-content/uploads/2019/02/serverless-use-case-768x355.png 768w, https://myifew.com/wp-content/uploads/2019/02/serverless-use-case-700x323.png 700w, https://myifew.com/wp-content/uploads/2019/02/serverless-use-case-600x277.png 600w, https://myifew.com/wp-content/uploads/2019/02/serverless-use-case.png 1494w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก <br><a href="https://www.slideshare.net/AmazonWebServices/deep-dive-on-aws-lambda">https://www.slideshare.net/AmazonWebServices/deep-dive-on-aws-lambda</a> <br></figcaption></figure>



<p>อ้างอิงจากรูป แบ่งตามประเภทแล้ว มันสามารถใช้งานได้ในหลากหลายรูปแบบ แต่เราต้องเข้าใจธรรมชาติมันก่อนนะว่า มันเกิดขึ้น ตั้งอยู่ ดับไป คิดเงินตามการใช้งานจริง และต้องมี Event Trigger ไปปลุกให้มันตื่น</p>



<p>จากความคิดเห็นส่วนตัวของผม ถ้าระบบที่เราจะนำไปใช้ มีความจำเป็นต้องใช้งานตลอดเวลา บางทีการมี Server ปกติ เปิดทิ้งไว้ อาจจะมีค่าใช้จ่ายที่ถูกกว่า และจัดการได้ง่ายกว่า หรือจะพิจารณา API บางตัวไปใช้เป็น Serverless ก็เพียงพอ ไม่ต้องทำทั้งระบบ ทั้งนี้ ไม่มีใครบอกได้ว่าควรใช้ส่วนไหนบ้าง อยู่ที่ผู้เข้าใจระบบเท่านั้น</p>



<h2 class="wp-block-heading">ข้อดี/ข้อเสียของ Serverless</h2>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="664" src="https://myifew.com/wp-content/uploads/2019/02/serverless-advantage-1200x664.png" alt="" class="wp-image-5294" srcset="https://myifew.com/wp-content/uploads/2019/02/serverless-advantage-1200x664.png 1200w, https://myifew.com/wp-content/uploads/2019/02/serverless-advantage-1024x566.png 1024w, https://myifew.com/wp-content/uploads/2019/02/serverless-advantage-768x425.png 768w, https://myifew.com/wp-content/uploads/2019/02/serverless-advantage-700x387.png 700w, https://myifew.com/wp-content/uploads/2019/02/serverless-advantage-600x332.png 600w, https://myifew.com/wp-content/uploads/2019/02/serverless-advantage.png 1222w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก <br><a href="https://www.slideshare.net/AmazonWebServices/deep-dive-on-aws-lambda">https://www.slideshare.net/AmazonWebServices/deep-dive-on-aws-lambda </a><br></figcaption></figure>



<p>หลังจากเข้าใจแล้วว่าคืออะไร ลองมาพิจารณาข้อดีข้อเสียและชั่งน้ำหนักก่อนจะตัดสินใจใช้งานดูนะครับ</p>



<ul class="wp-block-list"><li><strong>ข้อดี</strong><ul><li>ลดค่าใช้จ่าย เพราะจ่ายเท่าที่ประมวลผลจริง ไม่มีเปิด Server ทิ้งไว้</li><li>ไม่มี Server ให้ต้องดูแลและจัดการ</li><li>Scale&nbsp;ได้ต่อเนื่องตามการใช้งานจริง และอัตโนมัติ</li></ul></li><li><strong>ข้อเสีย</strong><ul><li>เรื่องของการ Initial Server ครั้งแรก (Cold&nbsp;Start) จะใช้เวลานิดหนึ่ง</li><li>ทรัพยากรที่จำกัด (Memory 128MB-3GB, Limit Concurrency 1,000/region/account)</li><li>แนวคิดการออกแบบซอร์ฟแวร์ที่จะยากขึ้น ว่าทำอย่างไรให้หั่นการทำงานใหญ่ๆ เป็นการทำงานย่อยๆ</li><li>การทดสอบใน Local Machine ยาก จำเป็นต้องมี Unit Test (และก็เขียน Unit Test ยากเช่นกัน)</li><li>Monitoring และ&nbsp;debugging ค่อนข้างยาก (ทำได้แต่เสียเงินเพิ่ม อย่าง AWS Lambda ต้องเปิดบริการอย่าง AWS Cloudwatch,  AWS X-Ray ในการดูเพิ่มเติม)</li><li>OS vulnerabilities ถูกดูแลโดยผู้ให้บริการ Serverless, เราอัพเดท&nbsp;หรือแก้ไขอะไรเองไม่ได้</li></ul></li></ul>



<h2 class="wp-block-heading">แถม: Serverless สามารถลดค่าใช้จ่ายได้จริงหรือ?</h2>



<p>เป็นข้อดีและก็เป็นข้อสงสัยว่า Serverless สามารถลดค่าใช้จ่ายได้จริงหรือ ซึ่งผมคิดว่าอยู่ที่การพิจารณาเอาไปใช้ ว่าทดแทนส่วนไหนแล้วลดค่าใช้จ่ายได้ ซึ่งไม่มีใครตัดสินใจให้ได้ แต่ผมจะขออธิบายโครงสร้างราคาและตัวอย่าง ของ AWS Lambda ไว้เป็นแนวทาง</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="450" src="https://myifew.com/wp-content/uploads/2019/02/aws-lambda-pricing-1200x450.png" alt="" class="wp-image-5297" srcset="https://myifew.com/wp-content/uploads/2019/02/aws-lambda-pricing-1200x450.png 1200w, https://myifew.com/wp-content/uploads/2019/02/aws-lambda-pricing-1024x384.png 1024w, https://myifew.com/wp-content/uploads/2019/02/aws-lambda-pricing-768x288.png 768w, https://myifew.com/wp-content/uploads/2019/02/aws-lambda-pricing-700x262.png 700w, https://myifew.com/wp-content/uploads/2019/02/aws-lambda-pricing-600x225.png 600w, https://myifew.com/wp-content/uploads/2019/02/aws-lambda-pricing.png 1964w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ที่มา https://aws.amazon.com/lambda/pricing/</figcaption></figure>



<p>โดย AWS Lambda มีการคิดเงินจากสองส่วน คือ</p>



<ul class="wp-block-list"><li><strong>คิดตามจำนวนการเรียกใช้ (Requests)</strong><ul><li>ให้ฟรี 1 ล้าน Requests ทุกเดือน</li><li>1 ล้านต่อไป คิดที่ $0.20 (~6 บาท)</li></ul></li><li><strong>คิดตามระยะเวลาประมวลผล (Duration Time)</strong><ul><li>ให้ฟรีประมวลผล 400,000 GB-Seconds* ทุกเดือน</li><li>ทุกๆ 1 GB-Seconds คิดที่ $0.00001667 (~0.00055011 บาท)</li><li>ทุกครั้งที่มีประมวลผล จะปัดเศษขึ้นที่หลัก 100ms (เช่น 15237ms = 15300ms, 97.12ms = 100ms, 0.43ms = 100ms) </li></ul></li></ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><em>ปล. GB-Seconds ย่อมาจาก Gigabyte second หมายความว่า การประมวลผลโดยใช้ Memory จำนวน 1 Gigabyte ใน 1 วินาที (เช่น เราจัดสรรให้ฟังก์ชั่นเราทำงาน 3GB แต่มีการประมวลผล 2 วินาที ก็เท่ากับการรันครั้งนี้ใช้งานไป 6 GB-Seconds)</em></p><cite>iFew</cite></blockquote>



<p>เรื่อง Requests น่าจะเข้าใจได้ แต่เรื่อง Duration Time กับ Memory อาจจะยังงงๆ ให้ดูภาพด้านล่างนี้ครับ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="400" src="https://myifew.com/wp-content/uploads/2019/02/lambda-duration-memory-1200x400.png" alt="" class="wp-image-5298" srcset="https://myifew.com/wp-content/uploads/2019/02/lambda-duration-memory-1200x400.png 1200w, https://myifew.com/wp-content/uploads/2019/02/lambda-duration-memory-1024x341.png 1024w, https://myifew.com/wp-content/uploads/2019/02/lambda-duration-memory-768x256.png 768w, https://myifew.com/wp-content/uploads/2019/02/lambda-duration-memory-700x233.png 700w, https://myifew.com/wp-content/uploads/2019/02/lambda-duration-memory-600x200.png 600w, https://myifew.com/wp-content/uploads/2019/02/lambda-duration-memory.png 1488w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: myifew.com</figcaption></figure>



<p>ในหน้าของ AWS Lambda เองจะมีข้อมูลบอกแบบนี้ ว่า Duration Time ของการประมวลผลจริงๆ เท่าไร (Actual) และคิดเงินที่เท่าไร (Billed) จากนั้นเอา Memory ที่เราจัดสรรให้กับ Server เรา มาคำนวณเพื่อหาว่า GB-Second ของการทำงานครั้งนี้เป็นเท่าไร</p>



<h3 class="wp-block-heading">โจทย์ตัวอย่าง</h3>



<p>ถ้ามีฟังก์ชั่นชื่อ get_product() โดยเราจัดสรร Memory ให้ 128MB มีการเรียกใช้งาน 30 ล้านครั้งใน 1 เดือน ซึ่งแต่ละครั้ง ใช้เวลาประมวลผล 200ms </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="381" src="https://myifew.com/wp-content/uploads/2019/02/lambda-example-pricing-1200x381.png" alt="" class="wp-image-5301" srcset="https://myifew.com/wp-content/uploads/2019/02/lambda-example-pricing-1200x381.png 1200w, https://myifew.com/wp-content/uploads/2019/02/lambda-example-pricing-1024x325.png 1024w, https://myifew.com/wp-content/uploads/2019/02/lambda-example-pricing-768x244.png 768w, https://myifew.com/wp-content/uploads/2019/02/lambda-example-pricing-700x222.png 700w, https://myifew.com/wp-content/uploads/2019/02/lambda-example-pricing-600x190.png 600w, https://myifew.com/wp-content/uploads/2019/02/lambda-example-pricing.png 1594w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพจาก: myifew.com</figcaption></figure>



<p>ในเดือนนั้น เราต้องจ่ายค่าประมวลผล get_product() ทั้งหมด $11.63 โดยคิดเป็นค่า Requests $5.80 และค่าประมวลผล (Compute) $5.83</p>



<h3 class="wp-block-heading">วิธีการคิด&nbsp;ค่า&nbsp;Requests</h3>



<p><strong>สูตรคือ</strong> Total requests – Free tier request = Billable requests<br><strong>แทนค่า</strong> 30M requests – 1M free tier requests = 29M Monthly billable requests<br><strong>สรุป</strong> Monthly request charges = 29M * $0.2/M = $5.80</p>



<h3 class="wp-block-heading" id="mce_70">วิธีการคิด&nbsp;ค่า&nbsp;Compute (Duration Time)</h3>



<p><strong>สูตรคือ</strong> Total compute (seconds) = 30,000,000 * 0.2sec = 6,000,000 seconds<br><strong>แปลงเป็น GB-Second</strong> Total compute (GB-s) = 6,000,000sec * 128MB/1024 = 750,000 GB-s<br><strong>หา GB-Second ที่ต้องจ่าย</strong> 750,000 GB-s – 400,000 free tier GB-s = 350,000 GB-s<br><strong>สรุป</strong> Monthly compute charges = 350,000 * $0.00001667 = $5.83</p>



<h2 class="wp-block-heading">สรุป</h2>



<p>หลังจากที่ผมได้เล่น AWS lambda แล้ว ผมชอบคอนเซ็ปมันนะ รู้สึกว่ามันกำลังพาเราก้าวเข้าสู่ยุคสมัยใหม่ (ขนาดนั้นเลยจริงๆ) แล้วมันก็มาพร้อมกับเรื่องที่เราต้องเรียนรู้อีกมากมาย เพราะจากความรู้สึกส่วนตัวของผม ผมรู้สึกเห็นภาพของ Unit Test และการ Design Architectuer อย่าง  Microservice ได้ชัดเจนมาก เพราะด้วย Platform มันบีบให้เราต้องทำ เพราะถ้าเราไม่ทำ มันมีค่าใช้จ่ายโดยตรงที่เราต้องเสีย อย่างจำนวน Request และ Duration Time ชัดเจน (ก่อนหน้านั้น เป็นค่าใช้จ่ายแฝงของการบริหารโปรเจ็คที่เราเห็นภาพไม่ค่อยชัด อย่างเข่นการไม่มี Test)</p>



<p><strong>Slide</strong></p>



<ul class="wp-block-list"><li><a href="https://www.slideshare.net/few/introduce-aws-lambda-for-newbie-and-nonit" target="_blank" rel="noreferrer noopener" aria-label="Introduce AWS Lambda for newbie and Non-IT (opens in a new tab)">Introduce AWS Lambda for newbie and Non-IT</a></li></ul>



<p><strong>อ้างอิง</strong></p>



<ul class="wp-block-list"><li>รูปปกจาก http://alena-vysotskaya.ru/stone-wall-wallpapers/img644822B2784</li><li>รูปอื่นๆ จาก ลิงค์ที่อ้างอิงใต้รูป</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ว่าด้วยเรื่องของ Microservices</title>
		<link>https://myifew.com/4315/what-is-microservices/</link>
					<comments>https://myifew.com/4315/what-is-microservices/#comments</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Tue, 16 Jan 2018 17:48:42 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Microservices]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=4315</guid>

					<description><![CDATA[มีคำถามบ่อยๆที่เจอมา ว่า Microservices คืออะไร บางทีก็กางแบบมาให้ดูว่า สิ่งที่ทำ เรียกว่า Microservies หรือเปล่า เลยขอสรุปบล็อกไว้นิดนึง]]></description>
										<content:encoded><![CDATA[<p>มีคำถามบ่อยๆที่เจอมา ว่า Microservices คืออะไร บางทีก็กางแบบมาให้ดูว่า สิ่งที่ทำ เรียกว่า Microservies หรือเปล่า เลยขอสรุปบล็อกไว้นิดนึง</p>
<h2>Microservices คืออะไร</h2>
<p>ถ้าเราจะต้องออกแบบระบบ หรือไปสังเกตว่าระบบไหนเป็น Microservices สามารถสังเกตจากคุณลักษณะ 6 ข้อ ของมันได้ดังต่อไปนี้<span id="more-4315"></span></p>
<h3><span class="fontstyle0">A microservice is responsible for a single piece of functionality</span></h3>
<p><span class="fontstyle0">มีหน้าที่ในทำงานเพียงแค่อย่างเดียว ซึ่งการจะเขียน Services เพื่อแบ่งหน้าที่การทำงานได้ จะต้องศึกษาถึงขอบเขตของ Services (Type of Capability) ว่าจะแบ่งด้วยหลักเกณฑ์ใด โดย หลักๆ มีสองประเภท คือ</span></p>
<ol>
<li><span class="fontstyle0"><strong>A Business Capabilitiy</strong> : แบ่งตามจุดมุ่งหมายของ Business เช่น ทำมาเพื่อคำนวณราคาสินค้า, ทำเพื่อเก็บข้อมูลลูกค้าที่ใช้งาน Shopping Cart เป็นต้น โดยการแบ่งตามนี้ มักใช้แนวทางของ DDD (Domain-Driven Development) เข้ามาช่วย</span></li>
<li><strong>A Technical Capability :</strong> แบ่งตาม Technology ที่ถูกกำหนดขึ้น เช่น มี Services อื่นต้องการใช้งานกับ Services ของเรา และมีข้อจำกัดบางอย่าง ดังน้ัน ต้องออกแบบ Services ให้ทำงานร่วมกันได้</li>
</ol>
<h3><span class="fontstyle0">A microservice is individually deployable</span></h3>
<p><span class="fontstyle0">มีอิสระต่อกัน ไม่ผูกพันกับส่วนอื่นๆ สามารถอยู่ได้ด้วยตัวเอง ถ้า Service ตัวหนึ่งพัง หรือปิดลง ตัวอื่นจะต้องไม่พังตามไปด้วย ดังนั้นการ Deploy จะเป็นอิสระจากระบบอื่นๆ ด้วย</span></p>
<p style="text-align: center;"><span class="fontstyle0"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4320 aligncenter" src="https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_26_06-Microservices_in_.NET_Core.pdf-Foxit-Reader.png" alt="" width="733" height="158" srcset="https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_26_06-Microservices_in_.NET_Core.pdf-Foxit-Reader.png 733w, https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_26_06-Microservices_in_.NET_Core.pdf-Foxit-Reader-600x129.png 600w, https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_26_06-Microservices_in_.NET_Core.pdf-Foxit-Reader-700x151.png 700w" sizes="auto, (max-width: 733px) 100vw, 733px" /> (ภาพจากหนังสือ Microservices in .Net Core)</span></p>
<p>ยิ่งการ Deploy เป็นก้อนใหญ่มาก ความเสี่ยงที่เกิดกับระบบก็จะมีมากขึ้น ดังนั้น ถ้าจะให้เป็นตามหลักการนี้ จะต้องคำนึงถึงการออกแบบให้เล็กพอที่จะไม่กระทบกับส่วนอื่นๆ และสามารถเปลี่ยนแปลงได้เรื่อยๆ</p>
<h3><span class="fontstyle0">A microservice consists of one or more processes</span></h3>
<p>ใน Microservices สามารถมีได้หลาย Process แต่ว่า จะต้องไม่ไปเกี่ยวกับ Process ของ Services ตัวอื่นๆ เช่น ระบบ Shopping Cart กับ Product Category จะต้องไม่มี Process การทำงานที่ไปเกี่ยวข้อง ดังนั้น ถ้ามันผูกกันอยู่ และเราต้องการ Deploy Shopping Cart ใหม่ เราจำเป็นต้อง Deploy Product Category ด้วย ทั้งๆที่มันไม่ได้ถูกแก้ไข</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4321 aligncenter" src="https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_40_50-Microservices_in_.NET_Core.pdf-Foxit-Reader.png" alt="" width="732" height="346" srcset="https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_40_50-Microservices_in_.NET_Core.pdf-Foxit-Reader.png 732w, https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_40_50-Microservices_in_.NET_Core.pdf-Foxit-Reader-600x284.png 600w, https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_40_50-Microservices_in_.NET_Core.pdf-Foxit-Reader-700x331.png 700w" sizes="auto, (max-width: 732px) 100vw, 732px" /><span class="fontstyle0"> (ภาพจากหนังสือ Microservices in .Net Core)</span></p>
<h3 style="text-align: left;"><span class="fontstyle0">A microservice owns its own data store.</span></h3>
<p style="text-align: left;">มีจัดเก็บข้อมูล (Data) เป็นของตนเอง ดังนั้น ถ้า Services แต่ละตัวต้องการใช้ข้อมูลของ Services อื่นๆ จะต้องเรียกผ่าน API ของ Services นั้น จะไม่เรียกตรงไปที่ Database เพราะ ถ้าในแต่ละ Microservices สามารถใช้เทคโนโลยี Database ต่างกันได้ และก็มีโอกาสที่จะเกิดเปลี่ยนแปลงภายหลังได้ ดังนั้น ถ้า Database มีการแก้ไขเกิดขึ้น ตัว API Service ที่เรียกใช้ จะต้องแก้ตามไปด้วย และอีกเหตุผลหนึ่งคือ ส่วนของ Database มักต้องควบคุมเรื่อง Performance และ Scalability ที่จะเกิดขึ้นได้ตลอดเวลา ดังนั้น ถ้ามีส่วนอื่นๆมาเกี่ยวข้องด้วย จะทำให้ควบคุมการใช้งานได้ยาก</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4322 aligncenter" src="https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_44_58-Microservices_in_.NET_Core.pdf-Foxit-Reader.png" alt="" width="736" height="446" srcset="https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_44_58-Microservices_in_.NET_Core.pdf-Foxit-Reader.png 736w, https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_44_58-Microservices_in_.NET_Core.pdf-Foxit-Reader-600x364.png 600w, https://myifew.com/wp-content/uploads/2018/01/2561-01-16-23_44_58-Microservices_in_.NET_Core.pdf-Foxit-Reader-700x424.png 700w" sizes="auto, (max-width: 736px) 100vw, 736px" /><span class="fontstyle0"> (ภาพจากหนังสือ Microservices in .Net Core)</span></p>
<h3 style="text-align: left;"><span class="fontstyle0">A small team can maintain a handful of microservices.</span></h3>
<p style="text-align: left;">ทีมเล็กๆ ก็สามารถดูแลรักษา Microservices ตัวหนึ่งๆได้ สามารถใช้ภาษาเขียนหรือเทคโนโลยีตามที่ทีมถนัดได้ เพราะแต่ละ Services แยกออกจากกัน</p>
<p>ถามว่าทีมเล็กๆที่ว่าควรเป็นเท่าไร คือ ประมาณ 5 คน</p>
<h3><span class="fontstyle0">A microservice is replaceable.</span></h3>
<p>จะต้องถูกออกแบบมาให้ทดแทนได้ เพราะบางที Requirement เปลี่ยน หรือมีเทคโนโลยีที่เหมาะสมใหม่เข้ามา เช่น ภาษาที่ใช้เขียน, Database ทีมที่พัฒนาจะใช้เวลาเท่าเดิมหรือเวลาที่เหมาะสม ในการพัฒนาใหม่ เพื่อนำไปใช้ทดแทนของเดิมได้ทันที</p>
<h2>หน้าตาของโครงสร้าง Microservices</h2>
<p>ถ้าอธิบายด้วยรูป เทียบกับการออกแบบแบบเดิม กับ Microservices</p>
<p style="text-align: center;"> <img loading="lazy" decoding="async" class="alignnone size-large wp-image-4318 aligncenter" src="https://myifew.com/wp-content/uploads/2018/01/B05447_01.png" alt="" width="248" height="367" />การออกแบบแบบเดิมตามชั้นการทำงาน (Traditional N-tier application architecture)<br />
(ภาพจาก <a href="https://www.packtpub.com/books/content/capability-model-microservices">https://www.packtpub.com/</a>)</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4317 aligncenter" src="https://myifew.com/wp-content/uploads/2018/01/B05447_02.png" alt="" width="343" height="279" />การออกแบบแบบ Microservices<br />
(ภาพจาก <a href="https://www.packtpub.com/books/content/capability-model-microservices">https://www.packtpub.com/</a>)</p>
<p>ดังนั้น ถ้าสมมติว่าเราได้แตก Services ออกมา และมีหลาย Services เชื่อมโยงกัน ภาพจะได้ประมาณนี้</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4319" src="https://myifew.com/wp-content/uploads/2018/01/Richardson-microservices-part1-2_microservices-architecture.png" alt="" width="815" height="832" srcset="https://myifew.com/wp-content/uploads/2018/01/Richardson-microservices-part1-2_microservices-architecture.png 815w, https://myifew.com/wp-content/uploads/2018/01/Richardson-microservices-part1-2_microservices-architecture-600x613.png 600w, https://myifew.com/wp-content/uploads/2018/01/Richardson-microservices-part1-2_microservices-architecture-768x784.png 768w, https://myifew.com/wp-content/uploads/2018/01/Richardson-microservices-part1-2_microservices-architecture-686x700.png 686w" sizes="auto, (max-width: 815px) 100vw, 815px" /><br />
(ภาพจาก <a href="https://www.nginx.com/blog/introduction-to-microservices/">https://www.nginx.com/</a>)</p>
<h2>ทำไมเราต้องใช้ Microservices</h2>
<p>พอเข้าใจและเห็นภาพของ Microservices กันบ้างแล้ว คำถามต่อมาคือ แล้วทำไมต้องใช้ หรือทำแล้วจะได้อะไร?</p>
<p>จาก คุณลักษณะ Microservices 6 ข้อ ข้างต้นที่ว่ามา จะทำให้เกิดผล 3 ข้อ ดังนี้</p>
<ul>
<li><strong>Malleable:</strong> พลิกแพลงระบบได้ง่าย (ระบบมี Flexible ยืดหยุ่น)</li>
<li><strong>Scalable :</strong> สามารถขยายออกได้ (หรือมีความ Elastic หดเข้าขยายออกได้ง่าย )</li>
<li><strong>Resilient :</strong> ตายไม่เป็น หรือเรียกกลับคืนได้ไว</li>
</ul>
<p>ถ้ามองให้เห็นภาพว่า 3 ข้อดังกล่าว จะให้ประโยชน์อะไรกับเราได้บ้าง คือ</p>
<h3><span class="fontstyle0">Enable continuous delivery</span></h3>
<p>ไม่ใช่ว่าทำ CI/CD แล้วจะต้องทำ Microservices นะครับ แต่หมายถึง มันสอดคล้องกัน ทำให้เราสามารถใช้กระบวนการ CI/CD (Continuouse Integration/Continuouse Delivery) ได้ง่ายขึ้น เพราะ</p>
<ul>
<li>พัฒนาระบบและแก้ไขได้ไว (ก็มันเล็กนี่นะ)</li>
<li>ทดสอบได้ด้วยการทำ automated tests (เพราะเล็ก ทดสอบการทำงานแค่อย่างเดียว ไม่ซับซ้อน)</li>
<li>Deploy ได้อย่างอิสระ</li>
<li>Operate ได้อย่างมีประสิทธิภาพ</li>
</ul>
<p>ดังนั้นถ้าสอดคล้องกับการทำ CI/CD แล้ว สิ่งที่เป็นประโยชน์ตามมาในระดับ Business คือ</p>
<ul>
<li>เพิ่มความเป็น<span class="fontstyle0"> Agility ให้เกิดขึ้น เพราะยืดหยุ่นและส่งมอบ product ได้ไวขึ้น</span></li>
<li><span class="fontstyle0">ทำให้ระบบน่าเชื่อถือขึ้น</span></li>
<li><span class="fontstyle0">ลดความเสี่ยง</span></li>
<li><span class="fontstyle0">และทำให้ product มีประสิทธิภาพมาขึ้น</span></li>
</ul>
<h3><span class="fontstyle0">High level of maintainability</span></h3>
<p>มีสองมุมมองคือ</p>
<p><strong>มุมมองของ Developer</strong></p>
<ul>
<li>ทำงานเพียงหนึ่งเดียว ง่ายต่อการพัฒนาและดูแล</li>
<li>เก็บข้อมูล (Data) ไว้ที่ตัวเอง และมีการกระทำจากแค่ภายใน Service ตนเอง ทำให้ง่ายต่อการเข้าใจระบบ</li>
<li>สามารถทำ Automated Test ได้ง่าย เพราะมี Process ทำงานเพียงเรื่องเดียว</li>
</ul>
<p>อีกมุมคือ <strong>มุมมองของ Operatios</strong></p>
<ul>
<li>สามารถดูแลได้ด้วยทีมขนาดเล็ก</li>
<li>ง่ายต่อการ Monitor การทำงานของแต่ละ Service</li>
<li>มีการ Deploy ที่เป็นอิสระจากกัน</li>
</ul>
<h2><span class="fontstyle0">Robust and scalable</span></h2>
<p>Microservices ง่ายต่อการขยาย เพราะเป็นอิสระต่อกัน ดังนั้น ถ้า Services ตัวใดต้องการขยายให้มีขนาดใหญ่ขึ้น(หรือเล็กลง) สามารถทำได้เฉพาะ Services นั้น ไม่จำเป็นต้องทำทั้งระบบ ประหยัดทรัพยากรได้ทางอ้อมด้วย</p>
<p>&#8212;</p>
<p>หลังจากได้รู้จัก Microservices ไปแล้ว ยังอยากทำอยู่หรือเปล่าครับ?</p>
<p>อ้างอิง</p>
<ul>
<li><a href="https://www.amazon.com/gp/product/1617293377/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1617293377&amp;linkCode=as2&amp;tag=myifew07-20&amp;linkId=bcc381d4404f04cc8aebcb2684598ffb" target="_blank" rel="noopener">Microservices in .NET Core: with examples in Nancy</a><img loading="lazy" decoding="async" style="border: none !important; margin: 0px !important;" src="//ir-na.amazon-adsystem.com/e/ir?t=myifew07-20&amp;l=am2&amp;o=1&amp;a=1617293377" alt="" width="1" height="1" border="0" /></li>
<li>ภาพปก <a href="https://auth0.com/blog/getting-a-competitive-edge-with-a-microservices-based-architecture/">https://auth0.com/blog/getting-a-competitive-edge-with-a-microservices-based-architecture/</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/4315/what-is-microservices/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
