Asenkron Nedir ?

Facebook ve Twitter’ın yükselişi ile birlikte, özellikle sosyal ağlarda anlık veri akışına alışır duruma geldik. Bildirimleri veya bize gelen mesajları görüntülemek için sayfayı yenileme işlemi geçmişte kalmış eski bir anı oldu. Peki, bu altyapıyı kullanan web siteleri bu gücü nereden alıyor? İşte, bu yazıda bu teknolojinin altında yatan mantığı temel olarak inceleyeceğiz.

Asenkron nedir‘e geçmeden önce hala birçok sistemin arka planında çalışan standart senkron yapının ne olduğundan bahsetmek gerek. Senkron bir web sunucusu, örnek olarak apache verilebilir, isteği alır, işler ve bu işlemin sonucunu geri döndürür. Bu süreç esnasında sunucu bloke edilmiş durumdadır yani herhangi bir başka isteğe cevap veremez. Bu düşük trafikli bir web sitesinde herhangi bir sıkıntı çıkarmayabilir ancak yüksek stres altındaki bir sunucunun geliştirici tabiri ile patlamasına yol açar. Bu durum geliştirici topluluğu arasında C10k Problemi olarak anılmaktadır. C10k sorununu aşmak ve projemize esneklik kazandırabilmek için ve özellikle real-time işlerin üstesinden gelebilmek için asenkron sunucular ile kullanıcıları karşılamak gerekmektedir.
Asenkron sistemler, senkron sistemlerin aksine aynı anda birden fazla isteği işleyebilirler. İstek yollanır, bu istek işlenir ve bu işleme esnasında başka bir istek daha yollanırsa o istek de işlenir. Bitirilen işlemlerin sonucu ise alınma sıralarına göre değil, bitirilme sıralarına göre geri döndürülür. Asenkron bir sistem, yaptığı işlem blocking bir istek değil ise sunucuyu bloke etmez, bu durum ise non-blocking olarak adlandırılır.
Günümüzde asenkron sistemler için en çok kullanılan alternatifler; Chrome’un Javascript motoru üzerine yazılmış, event-driven olan Node.JS ve Friendfeed’in altyapısında kullanılan sistemin Facebook tarafından açık kaynak haline getirilmesi ile aramıza katılan python tabanlı bir sunucu ve framework olan Tornado’dur. Node.JS kullanan sitelere trello.com’u, Tornado kullanan sitelere ise quara.com’u örnek verebiliriz.
Asenkron çalışmanın mantığını daha iyi anlayabilmek için örnek bir Node.js kodu yazmamız iyi olacaktır. Aşağıdaki kodları inceleyelim:
Öncelikle okuyabilmek için webmagazin.txt diye bir dosya oluşturup içine veri veri veri veri yazalım. Bu dosyanın yanında da node.js kodlarımızı içerecek app.js dosyamızı yaratıp içine şu kodları ekleyelim:

fs = require('fs');
var result = null;
fs.readFile('webmagazin.txt', 'utf8', function (err,data) {	result = data;	console.log("Veri okundu");
});
console.log("Okunan veri: " + result);

Bu kodun senkron yapıda düşündüğümüzde konsolda node app.js kodunu çalıştırdıktan sonra ekrana:

Veri okundu
Okunan veri: veri veri veri veri

yazmasını bekleriz ancak asenkron çalışan node.js üzerinde bu böyle gerçekleşmeyecektir çünkü node.js console.log işlemini daha önce bitireceği için ilk olarak onun sonucunu döndürecek ve daha sonra dosya okuma fonksiyonundaki işlem bittiğinde çalışacak olan callback‘i işleyecektir. Sonuç şu şekilde olur:

Okunan veri: null
Veri okundu

Asenkron yapının nasıl çalıştığı anlaşıldıktan sonra yazının ikinci bölümü olan real-time işlemlerin nasıl gerçekleştirildiğine değinip yazıyı bitireceğim.
Bir web sitesi üzerinde anlık işlemler yapmanın birçok yöntemi vardır ancak temel olarak en çok HTML5’in belki de en büyük nimeti olan websocketler ve bir diğer alternatif olarak long-polling kullanılır. Bu işlemleri yapabilmek için yine asenkron bir sunucu gerekmektedir. Websocketler ws protokolü üzerinden sunucu ve istemcinin haberleştiği bir kapıdır. Javascript tarafında onopen, onmessage, onerror, onclose, send, close öntanımlı metodları kullanılır ve sunucu tarafında backend kısmında hangi teknoloji kullanılıyorsa onun üzerinde tanımlanmış büyük bir ihtimalle yine aynı isimlerle anılacak metodlarda işlenir.
Örnek bir websocket kodu yazalım. Bir index.html dosyamız ve bir de node.js kodlarımızı içerecek app.js dosyamız olsun.

index.html

<html>
<head> <title>Websocket denemesi</title> <script> var conn = new WebSocket('ws://127.0.0.1:8000'); conn.onopen = function () { conn.send("Javascript tarafindan mesaj!"); }; conn.onmessage = function (message) { console.log(message.data); }; conn.onerror = function (error) { // Bir hata çıktığında çalışacak kısım! }; </script>
</head>
<body>
Websocket Denemesi
</body>
</html>

apps.js

var ws = require('websocket').server;
var http = require('http');
var server = http.createServer(function (request, response) { // HTTP isteklerini işleyecek kısım
});
server.listen(8000);
wsWrapper = new ws({ httpServer: server
});
// WebSocket server
wsWrapper.on('request', function (request) { var conn = request.accept(null, request.origin); conn.send("Node.js tarafindan mesaj!"); conn.on('message', function (message) { console.log(message.utf8Data); }); conn.on('close', function (conn) { // Websocket bağlantısı kapandığında çalışacak kısım });
});

Komut satırında node app.js yazıp, tarayıcıda index.html dosyasını çalıştırdığımızda konsolda Javascript tarafindan mesaj! yazısını, tarayıcının öğeyi denetle özelliği sayesinde konsol kısmında ise Node.js tarafindan mesaj! yazısını görüyoruz.Node.js için websocket modülü npm install websocket ile yüklenmelidir.Son olarak Long-polling örneğini ise Tornado üzerinde verelim. Long-polling, websockete oranla anlaşılması daha zor bir konudur. Sunucuya istek yollanır ve bu bağlantı sunucu tarafından bitirilinceye kadar açık kalır. Belli aralıklar ile ajax sorgusu yapmak yerine istek bir kere yapılır ve cevap gelmesi beklenir. Bu cevap gelene kadar istek Pending durumunda kalır.
Tüm Tornado kodlarını buraya yazmak yerine, Github üzerinde bulunan kendi chat örneğini incelemek daha iyi gibi.
Facebook ve Twitter, her ne kadar arka planda çok çok karmaşık işlemler dönse de hala long-polling kullanmaktadır. Websocketler, deneysel çalışmaların dışında özellikle bir fallback mekanizması yaratılmamışsa çok tercih edilmemektedir çünkü tarayıcı desteği ne yazık ki internet explorer açısından son derece kısıtlıdır ve ayrıca bazı güvenlik duvarları ws protokolünü tanımadığı için engellemektedir.
Tüm bu yazılanları özetlememiz gerekirse, web tarafında asenkron sistemler birden fazla işlemi aynı anda yapabilmek, uzun süreli işlemler için geçecek süreyi kullanıcıya yansıtmamak için ortaya çıkmış bir programlama prensibidir. Anlık değişim gerektirecek işlerde bu alternatiflerin kullanılması gerekir. Websocketler, asenkron sunucuların üstünde hızlıca çalışan bir mesajlaşma protokolüdür; long-polling ise sunucu tarafından istenildiğinde bitirilecek olan sürekli açık kalacak bağlantıları sağlayabilmek için gerekli olan sorgunun adıdır. Her ikisi için de asenkron bir sunucu gerekmektedir.
Bir sonraki yazıda asenkron alternatiflerin birbirleri arasında benchmark değerlerini, avantajlarını ve dezavantajlarını inceleyeceğiz.
Kaynak: Webmagazin

“Asenkron Nedir ?” için 1 yorum

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir