Pengkomputeran tanpa pelayan dengan AWS Lambda, Bahagian 1

Pengkomputeran tanpa pelayan mungkin merupakan perkara terpanas dalam pengkomputeran awan hari ini, tetapi apa sebenarnya? Tutorial dua bahagian ini dimulakan dengan gambaran keseluruhan pengkomputeran tanpa pelayan - dari sekarang, hingga mengapa dianggap mengganggu pengkomputeran awan tradisional, dan bagaimana anda menggunakannya dalam pengaturcaraan berasaskan Java.

Berikutan gambaran keseluruhan, anda akan mendapat pengenalan langsung mengenai AWS Lambda, yang dianggap oleh banyak penyelesaian berasaskan Java utama untuk pengkomputeran tanpa pelayan hari ini. Pada Bahagian 1, anda akan menggunakan AWS Lambda untuk membangun, menyebarkan, dan menguji fungsi Lambda pertama anda di Java. Pada Bahagian 2, anda akan mengintegrasikan fungsi Lambda dengan DynamoDB, kemudian menggunakan AWS SDK untuk memanggil fungsi Lambda dalam aplikasi Java.

Apakah pengkomputeran tanpa pelayan?

Tahun lalu saya bercakap dengan pelatih syarikat mengenai corak seni bina yang berbeza dan menyebut seni bina tanpa pelayan. Dia cepat memperhatikan bahawa semua aplikasi memerlukan pelayan, dan tidak dapat berjalan dengan udara tipis. Pelajar magang ada haknya, walaupun dia hilang milik saya. Pengkomputeran tanpa pelayan bukanlah platform ajaib untuk menjalankan aplikasi.

Sebenarnya, pengkomputeran tanpa pelayan bermaksud anda, pemaju, tidak perlu berurusan dengan pelayan. Platform pengkomputeran tanpa pelayan seperti AWS Lambda membolehkan anda membina kod anda dan menggunakannya tanpa perlu mengkonfigurasi atau mengurus pelayan yang mendasarinya. Unit penyebaran anda adalah kod anda; bukan wadah yang menghosting kod, atau pelayan yang menjalankan kod, tetapi hanya kod itu sendiri. Dari sudut pandang produktiviti, ada manfaat jelas untuk memuatkan butiran di mana kod disimpan dan bagaimana persekitaran pelaksanaan dikendalikan. Pengkomputeran tanpa pelayan juga berharga berdasarkan metrik pelaksanaan, jadi ada kelebihan kewangan juga.

Berapa kos AWS Lambda?

Pada masa penulisan ini, tahap harga AWS Lambda berdasarkan jumlah pelaksanaan dan tempoh pelaksanaan:

  • Juta pelaksanaan pertama anda sebulan adalah percuma, kemudian anda membayar $ 0.20 per juta pelaksanaan selepas itu ($ 0.0000002 setiap permintaan).
  • Tempoh dihitung dari saat kod anda mula dilaksanakan sehingga mengembalikan hasilnya, dibundarkan ke 100ms terdekat. Jumlah yang dikenakan adalah berdasarkan jumlah RAM yang diperuntukkan untuk fungsi tersebut, di mana harganya adalah $ 0,00001667 untuk setiap GB-saat.

Perincian harga dan peruntukan peringkat percuma sedikit lebih rumit daripada gambaran keseluruhan. Lawati tahap harga untuk melihat beberapa senario harga.

Untuk mendapatkan idea tentang bagaimana pengkomputeran tanpa server berfungsi, mari kita mulakan dengan model pelaksanaan pengkomputeran tanpa pelayan, yang digambarkan dalam Rajah 1.

Steven Haines

Berikut adalah model pelaksanaan tanpa pelayan secara ringkas:

  1. Seorang pelanggan membuat permintaan ke platform pengkomputeran tanpa pelayan untuk melaksanakan fungsi tertentu.
  2. Platform pengkomputeran tanpa pelayan terlebih dahulu memeriksa untuk mengetahui apakah fungsi tersebut dijalankan di mana-mana pelayannya. Sekiranya fungsinya belum berjalan, platform memuatkan fungsi dari penyimpanan data.
  3. Platform kemudian menyebarkan fungsi ke salah satu pelayannya, yang dikonfigurasikan dengan lingkungan pelaksanaan yang dapat menjalankan fungsi tersebut.
  4. Ini melaksanakan fungsi dan menangkap hasilnya.
  5. Ia mengembalikan hasilnya kembali kepada pelanggan.

Kadang kala pengkomputeran tanpa server disebut Function as a Service (FaaS), kerana butiran kod yang anda bina adalah fungsi . Platform melaksanakan fungsi anda di pelayannya sendiri dan mengatur proses antara permintaan fungsi dan respons fungsi.

Perkhidmatan nano, skalabiliti, dan harga

Tiga perkara penting mengenai pengkomputeran tanpa pelayan: seni bina perkhidmatan nanoservasinya; hakikat bahawa praktikalnya tidak dapat ditingkatkan; dan model harga yang berkaitan dengan skalabiliti yang hampir tidak terhingga. Kami akan mengkaji setiap faktor tersebut.

Perkhidmatan Nanoservice

Anda pernah mendengar tentang perkhidmatan mikro, dan anda mungkin tahu tentang aplikasi 12 faktor, tetapi fungsi tanpa pelayan mengambil paradigma memecah komponen ke bahagian penyusunnya ke tahap yang sama sekali baru. Istilah "nanoservice" bukanlah istilah yang diakui oleh industri, tetapi ideanya mudah: setiap nanoservice harus melaksanakan satu tindakan atau tanggungjawab. Sebagai contoh, jika anda ingin membuat widget, tindakan penciptaan akan menjadi perkhidmatan nanosanya sendiri; jika anda ingin mendapatkan widget, tindakan pengambilan juga akan menjadi perkhidmatan nano; dan jika anda ingin membuat pesanan untuk widget, pesanan itu akan menjadi perkhidmatan nanoservice lain.

Senibina nanoservice membolehkan anda menentukan aplikasi anda pada tahap yang sangat halus. Sama seperti pengembangan berdasarkan ujian (yang membantu anda mengelakkan kesan sampingan yang tidak diingini dengan menulis kod anda pada tahap ujian individu), seni bina perkhidmatan nanos mendorong untuk menentukan aplikasi anda dari segi fungsi yang sangat halus dan khusus. Pendekatan ini meningkatkan kejelasan mengenai apa yang anda bina dan mengurangkan kesan sampingan yang tidak diingini dari kod baru.

Perkhidmatan mikro vs perkhidmatan nanoservice

Perkhidmatan mikro mendorong kita memecah aplikasi menjadi kumpulan layanan yang masing-masing menyelesaikan tugas tertentu. Tantangannya ialah tidak ada yang benar-benar mengukur skop perkhidmatan mikro. Hasilnya, kami akhirnya menentukan perkhidmatan mikro sebagai kumpulan perkhidmatan yang berkaitan, semuanya berinteraksi dengan model data yang sama. Secara konseptual, jika anda mempunyai fungsi tahap rendah yang berinteraksi dengan model data tertentu, maka fungsi tersebut harus dimasukkan ke dalam salah satu perkhidmatannya yang berkaitan. Interaksi tahap tinggi harus membuat panggilan ke perkhidmatan dan bukannya meminta pangkalan data secara langsung.

Terdapat perdebatan yang berterusan dalam pengkomputeran tanpa pelayan mengenai sama ada untuk membina fungsi Lambda pada tahap perkhidmatan mikro atau perkhidmatan nanoservis. Berita baiknya adalah bahawa anda dapat membina fungsi anda dengan mudah pada butiran, tetapi strategi perkhidmatan mikro memerlukan sedikit logik penghalaan tambahan dalam pengendali permintaan anda.

Dari perspektif reka bentuk, aplikasi tanpa pelayan harus ditentukan dengan baik dan bersih. Dari perspektif penerapan, anda perlu menguruskan lebih banyak penyebaran, tetapi anda juga mempunyai kemampuan untuk menggunakan versi baru fungsi anda secara individu, tanpa mempengaruhi fungsi lain. Pengkomputeran tanpa server sangat sesuai untuk pengembangan dalam pasukan besar, di mana ia dapat membantu menjadikan proses pembangunan lebih mudah dan kodnya kurang ralat.

Skalabiliti

Di samping memperkenalkan paradigma seni bina baru, platform pengkomputeran tanpa pelayan menyediakan skalabiliti yang hampir tidak terhingga. Saya katakan "praktikal" kerana tidak ada perkara yang benar-benarskalabiliti yang tidak terhingga. Walau bagaimanapun, untuk semua tujuan praktikal, penyedia pengkomputeran tanpa pelayan seperti Amazon dapat menangani lebih banyak beban daripada yang mungkin anda lakukan. Sekiranya anda berjaya meningkatkan pelayan anda sendiri (atau mesin maya berasaskan awan) untuk memenuhi permintaan yang meningkat, anda perlu memantau penggunaan, mengenal pasti kapan hendak memulakan lebih banyak pelayan, dan menambahkan lebih banyak pelayan ke kluster anda pada waktu yang tepat. Begitu juga, apabila permintaan menurun, anda perlu menurunkan secara manual. Dengan pengkomputeran tanpa pelayan, anda memberitahu platform pengkomputeran tanpa pelayan anda jumlah maksimum permintaan fungsi serentak yang ingin anda jalankan dan platform melakukan penskalaan untuk anda.

Harga

Finally, the serverless computing pricing model allows you to scale your cloud bill based on usage. When you have light usage, your bill will be low (or nil if you stay in the free range). Of course, your bill will increase with usage, but hopefully you will also have new revenue to support your higher cloud bill. For contrast, if you were to manage your own servers, you would have to pay a base cost to run the minimum number of servers required. As usage increased, you would scale up in increments of entire servers, rather than increments of individual function calls. The serverless computing pricing model is directly proportional to your usage.

AWS Lambda for serverless computing

AWS Lambda adalah platform pengkomputeran tanpa pelayan yang dilaksanakan di atas platform Perkhidmatan Web Amazon seperti EC2 dan S3. AWS Lambda mengenkripsi dan menyimpan kod anda di S3. Apabila fungsi diminta untuk dijalankan, ia membuat "wadah" menggunakan spesifikasi waktu proses anda, menerapkannya ke salah satu contoh EC2 di ladang komputasinya, dan melaksanakan fungsi tersebut. Prosesnya ditunjukkan dalam Rajah 2.

Steven Haines

When you create a Lambda function, you configure it in AWS Lambda, specifying things like the runtime environment (we'll use Java 8 for this article), how much memory to allocate to it, identity and access management roles, and the method to execute. AWS Lambda uses your configuration to setup a container and deploy the container to an EC2 instance. It then executes the method that you've specified, in the order of package, class, and method.

At the time of this writing, you can build Lambda functions in Node, Java, Python, and most recently, C#. For the purposes of this article we will use Java.

What is a Lambda function?

When you write code designed to run in AWS Lambda, you are writing functions. The term functions comes from functional programming, which originated in lambda calculus. The basic idea is to compose an application as a collection of functions, which are methods that accept arguments, compute a result, and have no unwanted side-effects. Functional programming takes a mathematical approach to writing code that can be proven to be correct. While it's good to keep functional programming in mind when you are writing code for AWS Lambda, all you really need to understand is that the function is a single-method entry-point that accepts an input object and returns an output object.

Serverless execution modes

While Lambda functions can run synchronously, as described above, they can also run asynchronously and in response to events. For example, you could configure a Lambda to run whenever a file was uploaded to an S3 bucket. This configuration is sometimes used for image or video processing: when a new image is uploaded to an S3 bucket, a Lambda function is invoked with a reference to the image to process it.

I worked with a very large company that leveraged this solution for photographers covering a marathon. The photographers were on the course taking photographs. Once their memory cards were full, they loaded the images onto a laptop and uploaded the files to S3. As images were uploaded, Lambda functions were executed to resize, watermark, and add a reference for each image to its runner in the database.

All of this would take a lot of work to accomplish manually, but in this case the work not only processed faster because of AWS Lambda's horizontal scalability, but also seamlessly scaled up and back down, thus optimizing the company's cloud bill.

In addition to responding to files uploaded to S3, lambdas can be triggered by other sources, such as records being inserted into a DynamoDB database and analytic information streaming from Amazon Kinesis. We'll look at an example featuring DynamoDB in Part 2.

AWS Lambda functions in Java

Now that you know a little bit about serverless computing and AWS Lambda, I'lll walk you through building an AWS Lambda function in Java. 

muat turun Dapatkan kod Sumber kod untuk aplikasi contoh untuk tutorial ini, "Pengkomputeran tanpa server dengan AWS Lambda." Dicipta oleh Steven Haines untuk JavaWorld.

Melaksanakan fungsi Lambda

Anda boleh menulis fungsi Lambda dengan salah satu daripada dua cara:

  • Fungsi dapat menerima aliran input ke klien dan menulis ke aliran output kembali ke klien.
  • Fungsi tersebut dapat menggunakan antara muka yang telah ditentukan, dalam hal ini AWS Lambda akan secara automatik mendeserialisasikan aliran input ke suatu objek, menyebarkannya ke fungsi Anda, dan menyusun respons fungsi anda sebelum mengembalikannya ke klien.

Cara termudah untuk melaksanakan fungsi AWS Lambda adalah dengan menggunakan antara muka yang telah ditetapkan. Untuk Java, anda perlu memasukkan perpustakaan teras AWS Lambda berikut dalam projek anda (perhatikan bahawa contoh ini menggunakan Maven):

 com.amazonaws aws-lambda-java-core 1.1.0  

Next, have your class implement the following interface:

Listing 1. RequestHandler.java

 public interface RequestHandler { /** * Handles a Lambda function request * @param input The Lambda function input * @param context The Lambda execution environment context object. * @return The Lambda function output */ public O handleRequest(I input, Context context); } 

The RequestHandler interface defines a single method: handleRequest(), which is passed an input object and a Context object, and returns an output object. For example, if you were to define a Request class and a Response class, you could implement your lambda as follows:

 public class MyHandler implements RequestHandler { public Response handleRequest(Request request, Context context) { ... } } 

Alternatively, if you wanted to bypass the predefined interface, you could manually handle the InputStream and OutputStream yourself, by implementing a method with the following signature:

 public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { ... } 

The Context object provides information about your function and the environment in which it is running, such as the function name, its memory limit, its logger, and the amount of time remaining, in milliseconds, that the function has to complete before AWS Lambda kills it.