BurtiNETBlog
Teknoloji

RPC Nedir? Remote Procedure Call Nasıl Çalışır?

bnet6 dk okuma
RPC Nedir? Remote Procedure Call Nasıl Çalışır?
İçindekiler

Bir programın başka bir bilgisayarda çalışan fonksiyonu, sanki kendi içinde yazılmış gibi çağırabilmesi dağıtık sistemlerin temel ihtiyacıdır. RPC tam olarak bunu sağlar. Windows'ta karşınıza çıkan "RPC sunucusu kullanılamıyor" hatasından WordPress'in xmlrpc.php dosyasına, mikroservis mimarilerinde kullanılan gRPC'ye kadar birçok yerde RPC'yle karşılaşırsınız. Bu yazıda RPC'nin ne olduğunu, nasıl çalıştığını, türlerini ve REST'ten farkını anlatıyoruz.

RPC Nedir?

RPC (Remote Procedure Call, Uzaktan Yordam Çağrısı), bir programın başka bir adres uzayındaki (genellikle ağ üzerindeki başka bir bilgisayardaki) fonksiyonu, ağ ayrıntılarıyla uğraşmadan yerel bir fonksiyonmuş gibi çağırmasını sağlayan iletişim modelidir. Geliştirici hesapla(5, 3) gibi basit bir çağrı yazar; ağ üzerinden gönderme, karşı tarafta çalıştırma ve sonucu geri getirme işlemlerini RPC altyapısı üstlenir.

Kavram 1970'lerin sonlarına dayanır ve Sun Microsystems'in 1980'lerde geliştirdiği Sun RPC (ONC RPC) ile yaygınlaşmıştır. Bugün de modern biçimleriyle (JSON-RPC, gRPC) sıkça kullanılır.

Ağ anahtarlarına takılı mavi ve gri ethernet kabloları
RPC çağrıları ağ üzerinden, bu tür fiziksel altyapıdan geçerek karşı sisteme ulaşır · Fotoğraf: ShakataGaNai / CC BY-SA 3.0 / Wikimedia Commons

RPC Nasıl Çalışır?

RPC'nin çalışması, istemci ve sunucu tarafındaki "stub" (vekil) adı verilen küçük kod parçalarına dayanır. Bir RPC çağrısı genellikle şu adımlardan geçer:

  1. İstemci çağrısı: İstemci program, yerel bir fonksiyon çağırır gibi uzak fonksiyonu çağırır.
  2. İstemci stub'ı: Stub, fonksiyon adını ve parametreleri bir mesaja paketler (marshalling / serileştirme).
  3. Ağ iletimi: Mesaj, TCP ya da HTTP gibi bir taşıma protokolüyle sunucuya gönderilir.
  4. Sunucu stub'ı: Sunucu tarafındaki stub mesajı açar (unmarshalling) ve gerçek fonksiyonu çağırır.
  5. Yanıt: Fonksiyonun sonucu aynı yoldan paketlenip istemciye döner ve istemci kodu sonucu kullanır.

İstemci açısından çağrı çoğunlukla "bloklayıcı"dır: yanıt gelene kadar bekler. Modern sistemlerde asenkron (bekletmeyen) RPC çağrıları da yaygındır.

RPC Türleri

Zaman içinde farklı veri biçimlerini ve taşıma yöntemlerini kullanan birçok RPC çeşidi geliştirilmiştir. En bilinenleri şunlardır:

RPC TürüVeri BiçimiTaşımaTipik Kullanım
Sun RPC (ONC RPC)XDR (ikili)TCP/UDPNFS gibi UNIX ağ servisleri
XML-RPCXMLHTTPWordPress xmlrpc.php, eski web servisleri
JSON-RPCJSONHTTP, WebSocketHafif API'ler, blokzincir düğümleri
SOAPXMLHTTP, SMTPKurumsal entegrasyonlar
gRPCProtocol Buffers (ikili)HTTP/2Mikroservisler, yüksek performanslı servisler
Microsoft RPC (DCE/RPC)NDR (ikili)TCP, named pipesWindows servisleri, Active Directory

JSON-RPC Örneği

JSON-RPC 2.0, RPC'nin en sade örneklerinden biridir. İstemci fonksiyon adını ve parametreleri JSON olarak gönderir:

// İstek
{ "jsonrpc": "2.0", "method": "topla", "params": [5, 3], "id": 1 }

// Yanıt
{ "jsonrpc": "2.0", "result": 8, "id": 1 }

id alanı, yanıtı hangi isteğe ait olduğunu eşleştirmek için kullanılır. Hata olduğunda yanıtta result yerine error nesnesi bulunur.

gRPC Nedir?

gRPC, Google'ın geliştirdiği açık kaynaklı, yüksek performanslı bir RPC çerçevesidir. Servis ve mesaj yapıları .proto dosyalarında tanımlanır, veriler Protocol Buffers ile ikili biçimde serileştirilir ve HTTP/2 üzerinden taşınır. Bu sayede JSON'a göre daha küçük mesajlar ve çift yönlü akış (streaming) mümkündür. Birçok dil için otomatik istemci ve sunucu kodu üretilebildiği için mikroservis mimarilerinde yaygındır.

RPC ile REST Arasındaki Farklar

RPC ve REST ikisi de ağ üzerinden servis çağırmanın yollarıdır ama bakış açıları farklıdır. RPC "fonksiyon çağırma" odaklıdır, REST ise "kaynak" odaklıdır:

ÖzellikRPCREST
Temel yaklaşımEylem (fonksiyon) çağırır: kullaniciSil(42)Kaynağı yönetir: DELETE /kullanicilar/42
URL yapısıGenellikle tek uç noktaHer kaynak için ayrı URI
HTTP metotlarıÇoğunlukla POSTGET, POST, PUT, DELETE ayrı anlamlar taşır
ÖnbelleklemeZordurGET istekleri kolayca önbelleğe alınır
Performansİkili biçimlerde (gRPC) çok yüksekJSON ile genelde yeterli, biraz daha ağır
Tarayıcı uyumugRPC için ek katman gerekirDoğrudan uyumlu
Kullanım alanıServisler arası iç iletişimHerkese açık API'ler

Pratikte birçok sistem ikisini birlikte kullanır: dış dünyaya REST ya da GraphQL API sunar, iç servisler arasında ise gRPC ile hızlı iletişim kurar.

Sunucu rafında düzenli şekilde bağlanmış ağ kabloları ve patch panel
Dağıtık sistemlerde servisler arası RPC trafiği çoğunlukla bir veri merkezi ağında akar · Fotoğraf: Cloud899 / CC BY-SA 4.0 / Wikimedia Commons

RPC'nin Avantajları ve Dezavantajları

Avantajları

  • Uzak fonksiyonu yerel fonksiyon gibi çağırmayı sağlayarak geliştirme sürecini sadeleştirir.
  • İkili biçimlerde (gRPC, Sun RPC) düşük gecikme ve yüksek verim sunar.
  • Servis tanımından otomatik kod üretimi sayesinde istemci ve sunucu arasında tür güvenliği sağlar.

Dezavantajları

  • Ağ hatalarını gizlemeye çalıştığı için geliştiriciyi yanıltabilir; uzak çağrı yerel çağrı kadar güvenilir ve hızlı değildir.
  • İstemci ile sunucu arasında sıkı bağımlılık yaratır; fonksiyon imzası değiştiğinde iki tarafın da güncellenmesi gerekir.
  • Herkese açık API'lerde keşfedilebilirlik ve önbellekleme açısından REST kadar kolay değildir.

WordPress'te xmlrpc.php ve Güvenlik

WordPress, uzaktan yayın ve mobil uygulamalar için XML-RPC arayüzünü xmlrpc.php dosyasıyla sunar. Bu uç nokta tek bir istekte onlarca kullanıcı adı/şifre denemesi yapılmasına izin verdiği için brute force saldırılarının sık hedefidir. Mobil uygulama veya Jetpack gibi XML-RPC'ye bağımlı bir özellik kullanmıyorsanız bu dosyaya erişimi kapatmanız önerilir. Aşırı istek kaynaklı engelleri anlamak için 429 Too Many Requests hatası yazımızı da inceleyebilirsiniz.

Windows'ta "RPC Sunucusu Kullanılamıyor" Hatası

Windows'ta uzak bir bilgisayara bağlanırken ya da yazıcı ve paylaşım işlemlerinde "RPC sunucusu kullanılamıyor" (0x800706BA) hatası alıyorsanız, Windows'un RPC altyapısı ilgili makineye ulaşamıyordur. Sırasıyla şunları kontrol edin:

  1. Servislerin çalıştığını doğrulayın: services.msc içinde "Uzaktan Yordam Çağrısı (RPC)", "RPC Uç Nokta Eşleyicisi" ve "DCOM Sunucu İşlem Başlatıcısı" servislerinin "Çalışıyor" ve başlangıç türünün "Otomatik" olduğundan emin olun.
  2. Güvenlik duvarını kontrol edin: RPC Uç Nokta Eşleyicisi TCP 135 numaralı bağlantı noktasını kullanır; bu port ve dinamik RPC portları güvenlik duvarında engellenmemelidir.
  3. Ağ bağlantısını ve ad çözümlemesini test edin: Karşı makinenin adının doğru IP'ye çözüldüğünü ping ve nslookup ile doğrulayın.
  4. Dosya ve yazıcı paylaşımını açın: Ağ ve Paylaşım Merkezi'nde ilgili paylaşım ayarlarının etkin olduğunu kontrol edin.
  5. Sistem dosyalarını denetleyin: Yönetici olarak sfc /scannow komutunu çalıştırın.

Hatayı yalnızca belirli bir uzak sunucuda alıyorsanız sorun çoğunlukla o sunucunun güvenlik duvarında ya da durmuş bir servisindedir.

RPC'nin Gerçek Hayatta Kullanıldığı Yerler

RPC kavramı soyut görünse de günlük kullandığınız birçok sistemin arkasında çalışır:

  • Ağ dosya sistemleri: NFS gibi paylaşım servisleri uzak diskteki dosya işlemlerini RPC ile yapar.
  • Windows ağ servisleri: Dosya ve yazıcı paylaşımı, uzaktan yönetim ve Active Directory iletişimi Microsoft RPC üzerinden yürür.
  • Mikroservis mimarileri: Sipariş, ödeme ve stok servisleri birbirini gRPC ile çağırır.
  • Blokzincir düğümleri: Birçok düğüm yazılımı, cüzdan ve uygulamaların kendisiyle konuşması için JSON-RPC arayüzü sunar.
  • İçerik yönetim sistemleri: WordPress'in XML-RPC arayüzü, uzaktan yazı yayınlamak için kullanılır.

Bu örneklerin ortak noktası, çağıranın "ağ var" gerçeğini mümkün olduğunca gizlemesidir. Yine de ağ gecikmesi ve kopma riski vardır; iyi tasarlanmış bir RPC istemcisi zaman aşımı (timeout), yeniden deneme ve hata yönetimini mutlaka içerir.

RPC Çağrılarında Dikkat Edilecek Noktalar

  • Zaman aşımı belirleyin: Sonsuza kadar yanıt beklemek, sistemin tamamının takılmasına yol açabilir.
  • İdempotent tasarlayın: Aynı çağrı yeniden denendiğinde yan etki yaratmamalı (ör. aynı siparişi iki kez oluşturmamalı).
  • Sürümleme yapın: Fonksiyon imzaları değişirken eski istemcileri bozmamak için servis sürümleri kullanın.
  • Kimlik doğrulama ve şifreleme ekleyin: İç ağ olsa bile servisler arası trafiği TLS ile koruyun.

Sık Sorulan Sorular

RPC'nin açılımı nedir?

RPC, "Remote Procedure Call" ifadesinin kısaltmasıdır ve Türkçe'de "Uzaktan Yordam Çağrısı" olarak karşılanır. Bir programın başka bir bilgisayardaki fonksiyonu çağırması anlamına gelir.

RPC ile API aynı şey midir?

Hayır. API, iki yazılımın iletişim kurduğu arayüzün genel adıdır; RPC ise bu arayüzü fonksiyon çağırma biçiminde sunan bir iletişim modelidir. REST API'ler de bir API türüdür ama RPC değildir.

gRPC ile REST arasında hangisini seçmeliyim?

Herkese açık, tarayıcıdan erişilen API'ler için REST daha pratiktir. Servisler arası, düşük gecikme gerektiren iç iletişimde gRPC daha verimlidir.

RPC güvenli midir?

Güvenlik kullanılan protokole ve yapılandırmaya bağlıdır. Taşıma katmanında TLS kullanmak, kimlik doğrulamayı zorunlu kılmak ve gereksiz RPC uç noktalarını internete kapatmak temel önlemlerdir.

RPC hatası aldığımda bilgisayarı yeniden başlatmak işe yarar mı?

Servis geçici olarak takılmışsa yeniden başlatma sorunu çözebilir. Hata kalıcıysa RPC servislerini, güvenlik duvarı kurallarını ve ağ bağlantısını yukarıdaki adımlarla kontrol edin.

İlgili yazılar