Архитектура
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.
Связанные решения
- ADR-013: Socket.io — замена