Runbook: пропали/не обновляются тикеры и счётчики¶
1. Когда использовать¶
Признаки инцидента:
- В шапке/виджетах счётчики пустые или «зависли».
- После действий в комментариях (
прочитано,вопрос,ответ) значения не меняются. - В API значения одни, в UI другие.
- У части пользователей счётчики корректны, у части нет.
2. Быстрая классификация проблемы¶
Сначала определить, какой контур сломан:
- Системные тикеры (
unreadCommentsCount,questionsCount,badge,overDueTasksCountи т.д.). Их порядок в панели навигации жёстко зафиксирован в коде фронтенда и не настраивается. - Кастомные тикеры (админка
/administration/tickers,MenuItemTicker). Их порядок отображения управляется позицией строки в списке настроек (в обратном порядке). - Чат-счётчики (
/api/chats/counters, unread по чатам/подпискам). - Только UI-обновление (в API уже верно, но экран не подтянул изменения).
3. Как это работает (по коду)¶
3.1 Backend API¶
GET /api/tickers/all— основной снимок для SPA (системные + кастомные + ассистентские).GET /api/tickers/system— системные тикеры (можно частично по списку ключей).GET /api/tickers/custom— кастомные тикеры.GET /api/tickers/refresh-cache— принудительный refresh user cache.GET /api/tickers/refresh-subcat-cache/{subcatId}— refresh по подкатегории.
3.2 Источник значений¶
Системные тикеры:
TickersService.GetSystem->GetSystemByUserIds.- Если включён
UseSystemTickersCache, чтение идёт изTickersResultsCache. - При cache-miss/недостатке данных выполняется пересчёт:
dbo.UserTickers_refresh,- затем чтение через
dbo.GetSystemTickers.
Кастомные тикеры:
- Схема/доступность тикеров — из настроек меню и прав.
- Значения — из
UserMenuItemTickersCache/UserMenuItemTickers(черезTCTickerNavigationItem.GetUserTickersData). - Refresh пользовательских значений:
dbo.UserMenuItemTickers_refresh,dbo.SubcatTickers_refresh.
3.3 Realtime и pull в SPA¶
- Backend шлёт
SystemTickersUpdated, если после пересчёта есть реальное отличие от кеша. - SPA регулярно перечитывает
tickers/allчерез cron (tickers) и приgoOnline/userActive. - От signal/eventbus (
ReadComments,NewComment,QuestionComment,RefreshMTF,UpdateSystemTickersEventBusMessage) SPA делает частичныйtickers/system. - После comment-операций interceptor публикует событие обновления тикеров.
- Для чат-бейджей отдельно используется
chats/counters(cron + signal + tab visibility).
4. Что смотреть при разборе (чек-лист)¶
- Зафиксировать user id, время, какой именно счётчик «не сходится».
- Снять API-снимок:
GET /api/tickers/all,GET /api/tickers/system,GET /api/chats/counters(если проблема чатовая).- Сравнить API и UI:
- если API уже неверный -> backend/data/cache;
- если API верный, UI неверный -> signal/cron/store.
- Для системных тикеров проверить, не «завис» ли кеш:
- вызвать
GET /api/tickers/refresh-cache, - повторить
GET /api/tickers/system. - Для кастомных тикеров проверить админ-настройку и доступность тикера пользователю.
- Для кейсов после комментариев проверить, что был триггер обновления (eventbus/signal).
- Проверить, активна ли master-tab у пользователя (часть реакций фильтруется по active tab).
- Если проблема локальна для отдельных пользователей — проверить группы/права и фактический набор доступных тикеров.
5. Симптом -> вероятная причина -> проверка¶
| Симптом | Вероятная причина | Что проверить первым |
|---|---|---|
В API tickers/system значение уже неверное |
stale cache или не выполнен пересчёт | refresh-cache + повтор tickers/system |
| Кастомный тикер есть в админке, но не виден пользователю | нет прав на пункт меню/тикер | membership пользователя в группах + MenuItemTickerGroup |
После mark-as-answered/read счётчик в UI не изменился |
не отработал signal/eventbus путь | приход SystemTickersUpdated/ReadComments/RefreshMTF |
| Чат-бейдж не совпадает с остальными тикерами | divergence между tickers/* и chats/counters |
ответ GET /api/chats/counters и cron chatTickers |
| Только у одного пользователя «зависло» | персональный cache/state | refresh-cache, состояние master-tab, повторный API-снимок |
6. SQL для быстрой диагностики¶
declare @user_id int = 0;
declare @ticker_id int = 0;
-- Кастомные значения по пользователю
select
umit.UserID,
umit.MenuItemTickerId,
umit.ItemCount
from dbo.UserMenuItemTickers umit
where umit.UserID = @user_id
order by
umit.MenuItemTickerId;
-- Настройки тикеров
select
mit.Id,
mit.MenuItemID,
mit.TickerType,
mit.SqlSPName,
mit.DataSourceSettingId
from dbo.MenuItemTicker mit
where @ticker_id = 0 or
mit.Id = @ticker_id
order by
mit.Id;
-- Привязка тикера к группам
select
mtg.MenuItemTickerID,
mtg.GroupID
from dbo.MenuItemTickerGroup mtg
where @ticker_id = 0 or
mtg.MenuItemTickerID = @ticker_id
order by
mtg.MenuItemTickerID,
mtg.GroupID;
-- Системные тикеры (результат расчёта)
exec dbo.GetSystemTickers
@UserId = @user_id,
@OnlineUserOnlyF = 0;
7. Что приложить в задачу разработчикам¶
userId, timezone, время инцидента.- Скриншот UI со значением счётчика.
- Ответы
tickers/all,tickers/system,chats/counters(если применимо). - Результаты SQL-блока выше.
- Был ли вызван
refresh-cacheи что изменилось после него.
Связанные документы¶
docs/domains/grids/admin.mddocs/domains/chat/data-flow.mddocs/domains/comments/data-flow.mddocs/domains/notifications/data-flow.mddocs/reference/realtime/signalr-ui-map.md