Bahadirakin.dev
Bahadır AKIN | Tecrübe ihtiyacınız geçtikten sonra edinilir
Domain Summary
What is the traffic rank for Bahadirakin.dev?
• Bahadirakin.dev ranks #14,160,059 globally on HypeStat.
What IP addresses does Bahadirakin.dev resolve to?
• Bahadirakin.dev resolves to the IP addresses 216.239.36.21.
Where are Bahadirakin.dev servers located in?
• Bahadirakin.dev has servers located in Mountain View, California, 94035, United States.
bahadirakin.dev Profile
Title:Bahadır AKIN | Tecrübe ihtiyacınız geçtikten sonra edinilir
Description:Mikro servislerin kullanımı arttıkça, bloklanmış bir threadin etkilerini de daha fazla hissetmeye başladık. Fakat bu etkiyi azaltmanın yolları mevcut ve bu yollardan biri de asenkron ve baştan sonra bloklanmayan servisler yazmak. Bu yazıda elimden geldiğince asenkron servislerin yararlarından ve baştan sona asenkron bir servisin nasıl geliştirilebileceğinden (kısaca) bahsedeceğim. Asenkron vs Senkron Öncelikle asenkton ya da senkron derken neyi kastettiğimi bir örnek üzerinden anlatalım. Mesela, socket üzerinden byte array olarak gönderilen cümleleri okuyup String'e çeviren ve sonrasında da ekrana yazdıran bir uygulama geliştirdiğimizi varsayalım. Tabiki bunu bir çok şekilde yapabilirsiniz ama ben iki türüne odaklanmak istiyorum. İlk uygulamamızda, uygulamamızı çalıştıran ana thread gider socketi açar ve veriyi beklemeye başlar. Veri alışını tamamladıktan sonra veriyi String'e çevirir ve ekrana yazdırır. Burada ana threadimiz veri gelene kadar bloklanmış bir şekilde bekleyecektir. İkinci yöntem ise, uygulamanızı çalıştırırsınız, uygulamanız gider soketi açar fakat socketi açarken, veri geldiğinde çalışmasını istediği fonksiyonu da belirtir. Bundan sonra ana threadiniz veri gelene kadar özgürdür ve başka işler için kullanılabilir, yani bloklanmaz. Peki asenkron ve senkron kavramları nerede devreye giriyor? Tahmin edebileceğiniz gibi ilk örnek senkron olarak tasarlanabilir. Yani tüm işlemler aynı thread üzerinde yapılabilir. İkinci örnek ise kolaylıkla asenkron hale getirilebilir ve socketten bilgiyi alacak fonksiyon ayrı bir thread üzerinde, String'e çeviren ayrı bir threadte ve ekrana basma işlemi yine ayrı bir thread üzerinde tanımlanabilir. İsterseniz tam tersini, ilk örneği asenkron ikinci örneği senkron yapmayı da deneyebilirsiniz ama bu sadece işinizi zorlaştıracaktır. Aynı örnek üzerinden devam edecek olursak, asenkron ya da senkron olmasının ne gibi farkları olabilir biraz bunlara bakalım. İki farklı uygulamamıza socket üzerinden kimi daha uzun kimi daha kısa şekilde farklı farklı cümleler geliyor. Senkron olan uygulamamızda, tüm cümleler sockete yazıldıkları şekilde ekrana basılacaktır fakat asenkron olan uygulamamızda, kısa bir cümle kendinden önce gönderilmiş uzun bir cümleden önce ekrana yazılabilir. (Tabi String'e çevirme işleminin cümle uzunluğuna bağlı olarak çok daha uzun süreceğini varsayıyorum.) Yani asenkron uygulamamız cümle uzunluğunun doğurabileceği sorunlardan/gecikmelerden daha az etkilenecektir. Doğal olarak eğer ekranı okuyan bir kullanıcılarınız varsa, sadece uzun cümleyi bekleyen kullanıcınız etkilenecektir. Tabi eğer cümlelerin sırasının korunması gibi bir gereksiniminiz varsa asenkron uygulamanızın başka işlemler de yapması gerekecektir. Performans açısından baktığımızda, bu durum genelde asenkron olan uygulamanın cümleleri daha hızlı çevirdiği gibi bir algı oluşturuyor. Fakat yapacağınız işlem değişmediğinden asenkron bir yapı birim çevirme hızınızı değiştirmeyecektir. Örneğin senkron uygulamanız bir veriyi okuyup, String'e çevirip ekrana ortalama 5 ms'de basıyorsa, asenkron uygulamanızda da bu 5 ms'e sürecektir. Fakat asenkron uygulamanız CPU'yu daha verimli kullanacağından ekrana daha fazla cümle (throughput) yazdırabilirsiniz. Örneğin senkron uygulamanız saniyede ekrana 200 cümle yazdırabiliyorsa, asenkron uygulamanız saniyede 1800 cümle yazdırabilir. Asenkron yapıların diğer bir yararı da uygulamızın kabul edebileceği bağlantı sayısını arttırmasıdır. Bağlantıyı kabul eden threadlerin de aynı mantıkla çalışacağını düşünürseniz bu sizi şaşırtmayacaktır. Bağlantıyı kabul eden thread, talebi içerideki başka bir thread havuzuna iletecek ve sıradaki bağlantıyı kabul etmeye başlayabilecektir. Peki herşey bu kadar güzelse neden tüm uygulamalar asenkron olarak yazılmıyor? Çünkü yazdığınız uygulamanızın gereklilikleri asenkron uygulamanızdan alacağınız yararı arttırıp azaltabilir. Az önceki örnekteki gibi IO yoğun işlemler yapan bir uygulama geliştiriyorsanız, bloklanmayan yapılardan daha fazla yarar sağlayacaksınızdır fakat bunun tersi olarak CPU yoğun bir uygulamanız varsa asenkron yapıdan sağlayacağınız yarar azalacaktır. Bunun yanı sıra, asenkron yapının geliştirmesi ve testi de senkron bir yapıya göre daha zor olduğundan, senkron bir yapı daha çok tercih edilebiliyor. Tüm bu avantajlarını ve dezavantajlarını göz önüne aldığımızda, bloklanmayan yapıların mikro servisler için ne kadar önemli olduğunu görüyoruz. Bir mikro servis mimarisinde, çoğu servis başka bir servisi tüketmekte (IO) ve tükettiği servis üzerine küçük bir birimlik iş yapmaktadır. Yani, gerçekten mikro servislerle oluşturulmuş bir uygulamada asenkron yapının getirdiği faydalardan sonuna kadar yararlanabiliriz. Bu arada, büyük şirketler de yavaş yavaş bu yapıya geçiyorlar. Örneği Netflix'in bununla ilgili çok güzel bir yazısına şurdan ulaşabilirsiniz. Canlı ortamlarını bloklanmayan yapıya geçirdiklerinde deneyimledikleri yararlardan bahsediyorlar. Örnek Proje Spring Boot, Spring MVC ve Java 8 kullanarak, nasıl bir bloklanmayan servis geliştireceğimize bakalım. Ben örnek olması açısından HttpBin servisini tüketeceğim. HttpBin bize bir ip servisi sunuyor. Bu ip servisinden dış ip'nizi öğrenebiliyorsunuz. Yazacağımız servis ise sadece bu servisi çağırıp sonucu bize dönecek. Projenin Yaratılması Intellij'de Spring Initializer ya da start.spring.io kullanarak Spring Boot projemizi yaratıyoruz. Ben aşağıdaki bilgilerle yarattım, siz istediğiniz şekilde yaratabilirsiniz. Proje Adı: jdk8-async-mvc Group Id: com.bahadirakin Artifact Id: jdk8-async-mvc Package Name: com.bahadirakin HttpBin Entegrasyonu Öncelikle HttpBin ile entegre olalım. Ben istemci için Retrofit kullanacağım. Bunun bir kaç sebebi var: Java 8 ile gelen CompletableFuture'ı destekliyor. Bir çok Java kütüphanesiyle güzel bir şekilde entegre olabiliyor. Mesela JSON dönüşümü için ister GSON kullanın ister Jackson kullanın. Spring MVC ile birlikte Jackson geldiğinden ben Jackson kullanacağım. Interface üzerinden istemci oluşturabiliyorsunuz. Eğer Spring'in RestTemplate'ini kullanacak olsam çoğru şeyi kendim halletmem gerekecek. Retrofit'te ise interface geliştirip doğruca istemciye dönüştürebiliyorum. Öncelikle maven bağımlılıklarımızı ekleyelim: pom.xml [crayon-5d164465d99b4757792123/] HttpBin'in Ip servisi bize şu şekilde JSON'lar dönüyor. [crayon-5d164465d99c0803642805/] Şimdi bunu dönüştüreceğimiz modelimizi/DTOmuzu oluşturalım. Bunun için com.bahadirakin.model paketinin altına Ip isminde bir sınıf yaratıyoruz. İçeriği aşağıdaki gibi olacak. Ip.java [crayon-5d164465d99c6632893454/] Modelimizi yarattığımıza göre, şimdi de Interface'imizi yaratalım. Bunun için com.bahadirakin.service paketinin altına HttpBinService isminde bir interface yaratıyoruz. HttpBinService.java [crayon-5d164465d99cb128779723/] Son olarak, entegrasyonumuzun son halkasını yapıyoruz. Bu interface sınıfından istemcimizi oluşturacağız. Bunun için bir com.bahadirakin paketinin altına ClientConfiguration sınıfını oluşturuyoruz. ClientConfiguration.java [crayon-5d164465d99d0912940779/] Burada dikkat etmenizi istediğim bir kaç nokta var. Sadece bir istemci yaratıyor olabiliriz ama birden fazla thread pool ayarlaması yapıyoruz. Bunlardan biri bağlantılar için. Diğeri ise asenkron çalıştıracağımız metodlar için. Socket örneğinde olduğu gibi, istemcimize fonksiyon vereceğiz. İstemcimiz ise bu fonksiyonu "clientCallbackExecutor" içerisinde çalıştıracak IpController Entegrasyonu tamamladığımıza göre kendi Controller'ımızı yazabiliriz. Bunun için bir com.bahadirakin.control
What technologies does bahadirakin.dev use?
These are the technologies used at bahadirakin.dev. bahadirakin.dev has a total of 8 technologies installed in 9 different categories.bahadirakin.dev Traffic Analysis
Bahadirakin.dev is ranked #14,160,059 in the world.Daily Visitors n/a
Monthly Visits n/a
Pages per Visit n/a
Visit duration n/a
Bounce Rate n/a
Is this your site?Verify your site's metrics.
- Daily Unique Visitors:
- n/a
- Monthly Visits:
- n/a
- Pages per Visit:
- n/a
- Daily Pageviews:
- n/a
- Avg. visit duration:
- n/a
- Bounce rate:
- n/a
- Global Reach:
- n/a
- HypeRank:
- 14,160,059
Last update was 2092 days ago
This can take up to 60 seconds. Please wait...
This can take up to 60 seconds. Please wait...
*HypeStat.com is not promoting or affiliated with bahadirakin.dev in any way. Only publicly available statistics data are displayed.
▼
SEMrush is a complete on line advertising and marketing platform that gives a extensive variety of gear and functions to help companies and entrepreneurs in enhancing their on line visibility and optimizing their virtual advertising and marketing strategies.- Domain:
- bahadirakin.dev
- Rank:
(Rank based on keywords, cost and organic traffic) - n/a
- Organic Keywords:
(Number of keywords in top 20 Google SERP) - 0
- Organic Traffic:
(Number of visitors coming from top 20 search results) - 0
- Organic Cost:
((How much need to spend if get same number of visitors from Google Adwords) - $0.00
Ad Experience Report ▼
Summary of the ad experience rating of a website for a specific platform.Mobile summary
- Root domain:
- bahadirakin.dev
- Ad filtering:
(Chrome is not filtering ads on your site.) - Off
- Status:
(The status of the site that is reviewed for the Better Ads Standards.) - Not reviewed
Desktop summary
- Root domain:
- bahadirakin.dev
- Ad filtering:
(Chrome is not filtering ads on your site.) - Off
- Status:
(The status of the site that is reviewed for the Better Ads Standards.) - Not reviewed
Abusive Experience Report ▼
Summary of the abusive experience rating of a website.- Root domain:
- bahadirakin.dev
- Enforcement:
(Chrome is not preventing your site from opening new windows or tabs.) - Off
- Status:
(The status of the site reviewed for the abusive experiences.) - Not reviewed
Where is bahadirakin.dev hosted? ▼
Bahadirakin.dev may be hosted in multiple data centers distributed in different locations around the world. This is probably just one of them.- Server IP:
- 216.239.36.21
- ASN:
- AS15169
- ISP:
- Google LLC
- Server Location:
- Mountain View
California, CA
94035
United States, US
Other sites hosted on 216.239.36.21
Does bahadirakin.dev use compression? ▼
Website compression is the process of reducing the size of website files, such as HTML, CSS, JavaScript, and image files, to improve website performance and load times. Compressing website files can significantly reduce the amount of data that needs to be transferred from the server to the user's browser, resulting in faster page load times and improved user experience. Files on bahadirakin.dev are reduced by %.
bahadirakin.dev does not use compression.
Original size: n/a
Compressed size: n/a
File reduced by: (%)
Compressed size: n/a
File reduced by: (%)
Google Safe Browsing ▼
Google Safe Browsing is a service provided by Google that helps protect users from visiting websites that may contain malicious or harmful content, such as malware, phishing attempts, or deceptive software.SSL Checker - SSL Certificate Verify ▼
An SSL (Secure Sockets Layer) certificate is a digital certificate that establishes a secure encrypted connection between a web server and a user's web browser. It provides authentication and encryption, ensuring that data transmitted between the server and the browser remains private and protected. bahadirakin.dev does not support HTTPS. bahadirakin.dev does not support HTTPS
Verifying SSL Support. Please wait...
Verify HTTP/2 Support ▼
HTTP/2 (Hypertext Transfer Protocol version 2) is a major revision of the HTTP protocol, which is the foundation of data communication on the World Wide Web. It was developed as an improvement over the previous HTTP/1.1 version to enhance web performance and efficiency. bahadirakin.dev does not support HTTP/2
Verifying HTTP/2.0 Support. Please wait...
Http Header ▼
HTTP headers are extra portions of records despatched among a consumer (which include an internet browser) and a server at some stage in an HTTP request or response. They offer instructions, metadata, or manipulate parameters for the conversation among the consumer and server.Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /KinRl/
HTTP/1.1 302 Found
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:01 GMT
Content-Length: 477
Age: 8
Connection: keep-alive
Date: Sat, 29 Jun 2019 07:29:03 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
location:
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=15
Date: Sat, 29 Jun 2019 07:29:06 GMT
Server: Apache
Last-Modified: Wed, 16 Jan 2019 17:07:10 GMT
ETag: W/"e5-57f964f0142b7"
Content-Encoding: gzip
Server: nginx/1.14.2
Date: Sat, 29 Jun 2019 07:29:09 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Keep-Alive: timeout=20
Location: https://neko.dev/
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
HTTP/2 200
server: nginx/1.14.2
date: Sat, 29 Jun 2019 07:29:09 GMT
content-type: text/html; charset=UTF-8
content-length: 1442
last-modified: Thu, 28 Feb 2019 21:28:32 GMT
etag: "5c785280-5a2"
strict-transport-security: max-age=63072000
x-content-type-options: nosniff
accept-ranges: bytes
Server: nginx
Date: Sat, 29 Jun 2019 07:29:22 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 50
Connection: keep-alive
Location: http://www.illumipress.com/
X-Served-By: Namecheap URL Forward
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 29 Jun 2019 07:29:22 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.illumipress.com/
X-Powered-By: EasyEngine v4.0.10
HTTP/2 200
server: nginx
date: Sat, 29 Jun 2019 07:29:22 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
link: <https://www.illumipress.com/wp-json/>; rel="https://api.w.org/"
x-srcache-fetch-status: MISS
x-srcache-store-status: BYPASS
content-encoding: gzip
x-powered-by: EasyEngine v4.0.10
Content-Type: text/html; charset=UTF-8
Location: http://www.677199.xyz/
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:12 GMT
Content-Length: 145
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=v4jxrxhhse35uhvxq2eoxmke; path=/; HttpOnly
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:12 GMT
Content-Length: 7950
Content-Type: text/html; charset=UTF-8
Location: https://gwbdriverapp.com/
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:26 GMT
Content-Length: 148
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://www.gwbdriverapp.com/
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:26 GMT
Content-Length: 152
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://www.gwbdriverapp.com/driverapp/login.aspx
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:26 GMT
Content-Length: 172
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=remyweg3pavz5khgwockqphi; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:27 GMT
Content-Length: 13837
Date: Sat, 29 Jun 2019 07:29:28 GMT
Server: Apache/2.4.39 (Unix)
Content-Length: 4508
Content-Type: text/html
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=15
Date: Sat, 29 Jun 2019 07:29:29 GMT
Server: Apache
X-Powered-By: PHP/7.2.19
Content-Encoding: gzip
Server: nginx
Date: Sat, 29 Jun 2019 07:29:50 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 235
Connection: keep-alive
Location: https://trust-motherly.xyz/
HTTP/2 200
server: nginx
date: Sat, 29 Jun 2019 07:29:51 GMT
content-type: text/html
vary: Accept-Encoding
last-modified: Sat, 27 Apr 2019 14:21:32 GMT
etag: W/"3431-58783c498cbc8"
content-encoding: gzip
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /dOmTn/
HTTP/1.1 302 Found
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 29 Jun 2019 07:29:53 GMT
Content-Length: 473
Age: 0
Connection: keep-alive
Date: Sat, 29 Jun 2019 07:29:55 GMT
Server: Apache
Location: http://berlin.amalnews.de/
Content-Length: 234
Content-Type: text/html; charset=iso-8859-1
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Jun 2019 07:29:56 GMT
Server: Apache
Location: https://berlin.amalnews.de/
Content-Length: 235
Content-Type: text/html; charset=iso-8859-1
HTTP/2 302
date: Sat, 29 Jun 2019 07:29:56 GMT
server: Apache
location: https://amalnews.de/wp-signup.php?new=berlin
vary: User-Agent
content-length: 0
content-type: text/html
HTTP/2 301
date: Sat, 29 Jun 2019 07:29:58 GMT
server: Apache
expires: Wed, 11 Jan 1984 05:00:00 GMT
cache-control: no-cache, must-revalidate, max-age=0
x-redirect-by: WordPress
location: https://amalberlin.de
vary: User-Agent
content-length: 0
content-type: text/html; charset=UTF-8
HTTP/2 200
date: Sat, 29 Jun 2019 07:29:59 GMT
server: Apache
link: <https://amalberlin.de/wp-json/>; rel="https://api.w.org/", <https://amalberlin.de/>; rel=shortlink
vary: Accept-Encoding,User-Agent
content-encoding: br
content-type: text/html; charset=UTF-8
Location: http://bahadirakin.com
Date: Sat, 29 Jun 2019 07:30:02 GMT
Content-Type: text/html; charset=UTF-8
Server: ghs
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
HTTP/1.1 301 Moved Permanently
X-Powered-By: PHP/5.6.40
Content-Type: text/html; charset=UTF-8
Location: http://www.bahadirakin.com/
X-LiteSpeed-Cache: hit
Content-Length: 0
Date: Sat, 29 Jun 2019 07:30:00 GMT
Server: LiteSpeed
Connection: Keep-Alive
HTTP/1.1 200 OK
X-Powered-By: PHP/5.6.40
Content-Type: text/html; charset=UTF-8
Link: <http://www.bahadirakin.com/wp-json/>; rel="https://api.w.org/"
Link: <https://wp.me/2c1xv>; rel=shortlink
Etag: "8168-1561740390;br"
X-LiteSpeed-Cache: hit
Transfer-Encoding: chunked
Content-Encoding: br
Vary: Accept-Encoding
Date: Sat, 29 Jun 2019 07:30:00 GMT
Server: LiteSpeed
Connection: Keep-Alive