Архитектура

Ably для realtime-обновлений

Контекст

Нужны realtime-уведомления о новых заказах, изменениях статусов, сообщениях.

Решение

Использовать Ably как realtime-сервис.

Обоснование

КритерийAbly
Managed serviceДа
Pub/SubДа
PresenceДа
Message historyДа
SDKОтличное

Реализация

// realtime module или app/composables/useAbly.ts
import Ably from 'ably'

export function useAbly() {
  const config = useRuntimeConfig()
  const userStore = useUserStore()

  let ably: Ably.Realtime | null = null

  function connect() {
    if (ably) return

    ably = new Ably.Realtime({
      key: config.public.ablyKey,
      clientId: userStore.user?.id,
    })
  }

  function subscribe(
    channelName: string,
    callback: (message: Ably.Message) => void
  ) {
    if (!ably) connect()

    const channel = ably!.channels.get(channelName)
    channel.subscribe(callback)

    return () => channel.unsubscribe(callback)
  }

  function disconnect() {
    if (ably) {
      ably.close()
      ably = null
    }
  }

  return { connect, subscribe, disconnect }
}

Использование

<script setup lang="ts">
const { subscribe } = useAbly()

onMounted(() => {
  const unsubscribe = subscribe('orders:new', (message) => {
    // Обработка нового заказа
  })

  onUnmounted(unsubscribe)
})
</script>

Каналы

КаналСобытие
orders:newНовый заказ
orders:{id}:statusСмена статуса
notifications:{userId}Уведомление пользователю

Последствия

Положительные

  • Managed service
  • Надёжная доставка
  • Хороший SDK

Отрицательные

  • Внешняя зависимость
  • Стоимость
Deprecated: Заменено на Socket.io — см. ADR-013: Socket.io.

Связанные решения