<p>Backend için bu kadar — Reverb şimdi bu olayı yakalıyor ve bunu <code>chat.{receiverId}</code> kanalındaki bağlı WebSocket client'a iletiyor.</p>

<hr/>

<h2>
    <a name="6-catching-the-event-amp-updating-the-ui-in-realtime" href="#6-catching-the-event-amp-updating-the-ui-in-realtime"></a>
    6. Olayı Yakalamak &amp; Arayüzü Gerçek Zamanlı Güncelleme
</h2>

<p>Backend artık Reverb üzerinden olayları yayınlıyor. Ancak yayınlama, frontend etkin bir dinleme gerçekleştirmedikçe bir anlam ifade etmez. Bu noktada <strong>Laravel Echo</strong> devreye giriyor.</p>

<h3>
    <a name="configuring-echo" href="#configuring-echo"></a>
    Echo'yu Yapılandırmak
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight javascript"><code>// resources/js/bootstrap.js

import Echo from ‘laravel-echo’;
import Pusher from ‘pusher-js’;
window.Pusher = Pusher;

window.Echo = new Echo({
broadcaster: ‘reverb’,
key: import.meta.env.VITE_REVERB_APP_KEY,
wsHost: import.meta.env.VITE_REVERB_HOST,
wsPort: import.meta.env.VITE_REVERB_PORT ?? 80,
wssPort: import.meta.env.VITE_REVERB_PORT ?? 443,
forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? ‘http’) === ‘https’,
enabledTransports: [‘ws’, ‘wss’],
});

<ul>
    <li><code>key</code> → REVERB_APP_KEY ile eşleşmelidir</li>
    <li><code>wsHost</code> ve <code>wsPort</code> → Reverb sunucunuza işaret ediyor</li>
    <li><code>forceTLS</code> → Üretimde otomatik olarak <code>wss://</code> geçiş yapar</li>
</ul>

<p>Bu aşamada, tarayıcı uygulamanız yüklendiğinde Reverb sunucusuna kalıcı bir WebSocket bağlantısı kurar.</p>

<h3>
    <a name="listening-to-the-private-channel" href="#listening-to-the-private-channel"></a>
    Özel Kanala Dinleme
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight javascript"><code>const userId = window.App.user.id;

window.Echo.private(chat.${userId})
.listen(‘MessageSent’, (event) => {
console.log(‘Yeni mesaj alındı:’, event.message);
appendMessage(event.message);
});

<p>Hiçbir polling yok. Hiçbir interval yok. Hiçbir tekrarlanan API çağrısı yok. Client artık yalnızca <strong>dinliyor</strong>.</p>

<h3>
    <a name="updating-the-ui" href="#updating-the-ui"></a>
    Arayüzü Güncelleme
</h3>

<div class="highlight js-code-highlight">
    <pre class="highlight javascript"><code>function appendMessageToUI(message) {
const chatBox = document.getElementById('chat-box');
const messageElement = document.createElement('div');
messageElement.classList.add('message');
messageElement.innerText = message.body;
chatBox.appendChild(messageElement);

}

<p><code>MessageSent</code> yayınlandığında:</p>

<ol>
    <li>Reverb bunu tarayıcıya gönderir</li>
    <li>Echo bunu yakalar</li>
    <li>Callback'ınız çalışır</li>
    <li>DOM anında güncellenir</li>
</ol>

<hr/>

<h2>
    <a name="7-real-metrics-before-vs-after" href="#7-real-metrics-before-vs-after"></a>
    7. Gerçek Metrikler: Önce vs Sonra
</h2>

<p>Polling'den WebSockets'e geçerken, iyileşme teorik değil — ölçülebilir. Aşağıdaki karşılaştırma, 80 eşzamanlı kullanıcıya dayanmaktadır.</p>

<div class="table-wrapper-paragraph">
    <table>
        <thead>
            <tr>
                <th>Metrik</th>
                <th>Polling</th>
                <th>WebSockets (Reverb)</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>HTTP İstekleri/dk</td>
                <td>~1,600</td>
                <td>~0 (kalıcı bağlantı)</td>
            </tr>
            <tr>
                <td>Mesaj Gecikmesi</td>
                <td>3 saate kadar</td>
                <td>Neredeyse anında</td>
            </tr>
            <tr>
                <td>Sunucu Yükü</td>
                <td>Yüksek (sürekli istekler)</td>
                <td>Düşük (olay odaklı)</td>
            </tr>
            <tr>
                <td>Multi-sekme Davranışı</td>
                <td>Hızla bozuluyor</td>
                <td>Stabil</td>
            </tr>
        </tbody>
    </table>
</div>

<hr/>

<h2>
    <a name="8-realworld-use-cases-beyond-chat" href="#8-realworld-use-cases-beyond-chat"></a>
    8. Sohbetin Ötesindeki Gerçek Dünya Kullanım Senaryoları
</h2>

<p>Bu mimari yalnızca mesajlaşma ile sınırlı değildir. WebSockets kurulduğunda, güçlü kapasitelerin kilidi açılır:</p>

<ul>
    <li>🔔 <strong>Canlı Bildirimler</strong> — Sayfayı yenilemeden anlık uyarılar</li>
    <li>📊 <strong>Gerçek Zamanlı Gösterge Panelleri</strong> — Metrikleri anında güncelleyebilen admin panelleri</li>
    <li>📦 <strong>Sipariş Takibi</strong> — Teslimat durumu güncellemeleri anlık olarak iletilir</li>
    <li>🧠 <strong>Canlı Analizler</strong> — Aktif kullanıcı sayıları, satış metrikleri, trafik izleme</li>
    <li>🏭 <strong>IOt İzleme</strong> — Cihazların sensör verilerini anlık olarak panellere iletmesi</li>
</ul>

<p>"Bir şey olursa" ve kullanıcıların bunu anında görmesi gereken her sistem mükemmel bir adaydır.</p>

<hr/>

<h2>
    <a name="9-final-thoughts" href="#9-final-thoughts"></a>
    9. Son Düşünceler
</h2>

<p>Sohbet sistemini yeniden inşa etmek yolculuğun yalnızca yarısıydı.</p>

<p>Polling'den WebSockets'e geçiş, performans ve gecikme problemlerini çözmüştür — ancak WebSockets'in üretimde çalıştırılması yeni zorluklar getirir:</p>

<ul>
    <li>Reverse proxy yapılandırması</li>
    <li>SSL sonlandırma (<code>wss://</code>)</li>
    <li>İşlem gözetimi</li>
    <li>Güvenlik duvarı kuralları</li>
    <li>Ölçeklendirme stratejisi</li>
</ul>

<p><strong>2. Bölüm</strong>'de, Nginx arkasında Laravel Reverb'i üretime dağıtmaya yönelik nasıl yapılandırılacağını, yaygın sorunları ve yolda karşılaşabileceğiniz sorunları gözden geçireceğim.</p>

<h2>
    <a name="stay-connected" href="#stay-connected"></a>
    🔗 Bağlantıda Kalın
</h2>

<p>Daha fazla Laravel eğitimi, geliştirici ipuçları, dağıtım iş akışları ve gerçek dünya üretim sorunlarını çözmek için beni takip edin.</p>

<p><strong>Bu makaleyi yararlı buldunuz mu?</strong></p>
<p>🙏 Desteklerinizi gösterin 👏, abone olun 🔔, sosyal ağlara paylaşın.</p>

Kaynak: Orijinal Makale

Bu Makaleyi Paylaş