Bifrost Integration Chat — 2026-03-02 (Monday)
Channel: #forsyt-bm-integration (Suntech Innovation Slack)
Michael Cheremuhin — 3:16 PM
@Prashant Malik hi! some observations:
Michael Cheremuhin — 3:16 PM
- potentially you might have too agressive recovery API usage
Michael Cheremuhin — 3:16 PM
📎 image.png (png, 147KB)
Michael Cheremuhin — 3:17 PM
we don't mind using it, but massive data recovery might cause stuck prices while it's processing
Michael Cheremuhin — 3:17 PM
- there is something with markets updates, can you please check matchodds changes logs for https://forsyt.io/fixture/35323228?sportId=27
forsyt.io | Private Sports Trading Platform Private sports exchange built for speed and designed for trust. Trade your edge with the sharpest odds, credit-based settlements, and AI-powered insights.
Thread (57 replies):
Michael Cheremuhin — 3:18 PM in the last attempt we were changing the odds for South Africa from 70, then 72, 74, 76, 78 and 80. during that prices changed to 76 and got stuck on 76
Michael Cheremuhin — 3:21 PM logs from our end:
Michael Cheremuhin — 3:21 PM 70:
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 70,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 82,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772444765299"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 121,
"maxStake": 1652.89,
"maxStakeCurrencies": {
"hkd": 1652.89,
"aed": 780,
"eur": 190,
"bdt": 25825,
"gbp": 160,
"rmb": 1515,
"usd": 210,
"inr": 18365
}
}
],
"availableToLay": [
{
"price": 143,
"maxStake": 1398.6,
"maxStakeCurrencies": {
"hkd": 1398.6,
"aed": 660,
"eur": 160,
"bdt": 21850,
"gbp": 135,
"rmb": 1280,
"usd": 175,
"inr": 15540
}
}
]
},
"version": "1772444765299"
}
],
"version": "1772444765375",
"sportId": "2"
}```
**Michael Cheremuhin** — 3:21 PM
72:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 72,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 84,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772444837364"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 119,
"maxStake": 1680.67,
"maxStakeCurrencies": {
"hkd": 1680.67,
"aed": 795,
"eur": 195,
"bdt": 26260,
"gbp": 165,
"rmb": 1540,
"usd": 215,
"inr": 18670
}
}
],
"availableToLay": [
{
"price": 139,
"maxStake": 1438.84,
"maxStakeCurrencies": {
"hkd": 1438.84,
"aed": 680,
"eur": 165,
"bdt": 22480,
"gbp": 140,
"rmb": 1320,
"usd": 180,
"inr": 15985
}
}
]
},
"version": "1772444837364"
}
],
"version": "1772444837432",
"sportId": "2"
}```
**Michael Cheremuhin** — 3:21 PM
74:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 74,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 88,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772444843826"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 113,
"maxStake": 1769.91,
"maxStakeCurrencies": {
"hkd": 1769.91,
"aed": 835,
"eur": 205,
"bdt": 27650,
"gbp": 175,
"rmb": 1620,
"usd": 225,
"inr": 19665
}
}
],
"availableToLay": [
{
"price": 136,
"maxStake": 1470.58,
"maxStakeCurrencies": {
"hkd": 1470.58,
"aed": 695,
"eur": 170,
"bdt": 22975,
"gbp": 145,
"rmb": 1345,
"usd": 185,
"inr": 16335
}
}
]
},
"version": "1772444843826"
}
],
"version": "1772444843896",
"sportId": "2"
}```
**Michael Cheremuhin** — 3:21 PM
76:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 76,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 90,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772444847129"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 111,
"maxStake": 1801.8,
"maxStakeCurrencies": {
"hkd": 1801.8,
"aed": 850,
"eur": 210,
"bdt": 28150,
"gbp": 175,
"rmb": 1650,
"usd": 230,
"inr": 20020
}
}
],
"availableToLay": [
{
"price": 132,
"maxStake": 1515.15,
"maxStakeCurrencies": {
"hkd": 1515.15,
"aed": 715,
"eur": 175,
"bdt": 23670,
"gbp": 150,
"rmb": 1390,
"usd": 190,
"inr": 16835
}
}
]
},
"version": "1772444847129"
}
],
"version": "1772444847197",
"sportId": "2"
}```
**Michael Cheremuhin** — 3:21 PM
78:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 78,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 92,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772444851041"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 108,
"maxStake": 1851.85,
"maxStakeCurrencies": {
"hkd": 1851.85,
"aed": 875,
"eur": 215,
"bdt": 28935,
"gbp": 180,
"rmb": 1695,
"usd": 235,
"inr": 20575
}
}
],
"availableToLay": [
{
"price": 129,
"maxStake": 1550.38,
"maxStakeCurrencies": {
"hkd": 1550.38,
"aed": 730,
"eur": 180,
"bdt": 24220,
"gbp": 150,
"rmb": 1420,
"usd": 195,
"inr": 17225
}
}
]
},
"version": "1772444851041"
}
],
"version": "1772444851111",
"sportId": "2"
}```
**Michael Cheremuhin** — 3:21 PM
80:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 80,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 94,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772444853621"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 106,
"maxStake": 1886.79,
"maxStakeCurrencies": {
"hkd": 1886.79,
"aed": 890,
"eur": 215,
"bdt": 29480,
"gbp": 185,
"rmb": 1730,
"usd": 240,
"inr": 20960
}
}
],
"availableToLay": [
{
"price": 125,
"maxStake": 1600,
"maxStakeCurrencies": {
"hkd": 1600,
"aed": 755,
"eur": 185,
"bdt": 25000,
"gbp": 155,
"rmb": 1465,
"usd": 205,
"inr": 17775
}
}
]
},
"version": "1772444853621"
}
],
"version": "1772444853697",
"sportId": "2"
}```
**Michael Cheremuhin** — 3:22 PM
membersite got stuck on 76. we need to understand the reason why
**Michael Cheremuhin** — 3:37 PM
in a while it got updated to 80. now i made update to 82:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 82,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 96,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772445963467"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 104,
"maxStake": 1923.07,
"maxStakeCurrencies": {
"hkd": 1923.07,
"aed": 910,
"eur": 220,
"bdt": 30045,
"gbp": 190,
"rmb": 1760,
"usd": 245,
"inr": 21365
}
}
],
"availableToLay": [
{
"price": 122,
"maxStake": 1639.34,
"maxStakeCurrencies": {
"hkd": 1639.34,
"aed": 775,
"eur": 190,
"bdt": 25610,
"gbp": 160,
"rmb": 1500,
"usd": 210,
"inr": 18210
}
}
]
},
"version": "1772445963467"
}
],
"version": "1772445963547",
"sportId": "2"
}```
but membersite remains in 80:
**Michael Cheremuhin** — 3:37 PM
📎 image.png
**Bhargav** — 3:42 PM
Okay. Will fix and update here
**Bhargav** — 8:30 PM
Hey @Michael Cheremuhin
We've deployed a fix to our staging environment that addresses the queue flooding issue (the 10-min periodic recovery was requesting
full market books, causing the 70→72→...→82 odds drift).
What we changed:
- Periodic recovery now skips market books (includeMarketBook=false) — only cold start fetches them
- Added trailing-edge throttle to prevent burst requests to your API
Can you help validate?
- New URL: [bhdev.forsyt.io](http://bhdev.forsyt.io)
- Login: Click "Sign In" → scroll to the bottom of the modal → click the yellow "Dev Login" button → enter any username (e.g. michael) — no password
needed
- Check for any issues and latency gaps
- Confirm data quality and that odds updates are arriving promptly
We're monitoring queue depth on our side. Would appreciate your eyes on it when you get a chance.
**Michael Cheremuhin** — 8:32 PM
hi @Bhargav. let me check, but before I proceed - you are not consuming the same queues from different envs/clients, right?
**Michael Cheremuhin** — 8:32 PM
as otherwise the updates will be stealing between the envs
**Michael Cheremuhin** — 9:32 PM
basically that's what is happening now - updates are picked either by [forsyt.io](http://forsyt.io) or by [bhdev.forsyt.io](http://bhdev.forsyt.io), as once message is consumed from rabbitmq, is not available to be consumed again
**Pran** — 9:45 PM
Can you try again
**Bhargav** — 9:45 PM
We stopped [forsyt.io](http://forsyt.io) server
**Michael Cheremuhin** — 9:46 PM
i've did two updates now:
74:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 74,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 88,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772468135765"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 113,
"maxStake": 1769.91,
"maxStakeCurrencies": {
"hkd": 1769.91,
"aed": 835,
"eur": 205,
"bdt": 27650,
"gbp": 175,
"rmb": 1620,
"usd": 225,
"inr": 19665
}
}
],
"availableToLay": [
{
"price": 136,
"maxStake": 1470.58,
"maxStakeCurrencies": {
"hkd": 1470.58,
"aed": 695,
"eur": 170,
"bdt": 22975,
"gbp": 145,
"rmb": 1345,
"usd": 185,
"inr": 16335
}
}
]
},
"version": "1772468135765"
}
],
"version": "1772468135835",
"sportId": "2"
}```
and 79:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 79,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 93,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772468139065"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 107,
"maxStake": 1869.15,
"maxStakeCurrencies": {
"hkd": 1869.15,
"aed": 885,
"eur": 215,
"bdt": 29205,
"gbp": 185,
"rmb": 1710,
"usd": 235,
"inr": 20765
}
}
],
"availableToLay": [
{
"price": 127,
"maxStake": 1574.8,
"maxStakeCurrencies": {
"hkd": 1574.8,
"aed": 745,
"eur": 180,
"bdt": 24605,
"gbp": 155,
"rmb": 1440,
"usd": 200,
"inr": 17495
}
}
]
},
"version": "1772468139065"
}
],
"version": "1772468139134",
"sportId": "2"
}```
**Michael Cheremuhin** — 9:47 PM
market stays with 74. can you please check if 79 odds change was received
**Michael Cheremuhin** — 9:52 PM
now it's applied, but looks like took very long time. do we know how market changed to the latest state? you can check version in my messages to compare with your state of the data
**Bhargav** — 10:08 PM
Yes, both updates were received. The 74 arrived at 16:15:35, but the 79 was delayed ~5 minutes
because our periodic recovery (10-min cycle) fired at 16:15:55 and flooded our catalogue queue with
~3,750 messages. Since Node.js is single-threaded, the catalogue processing blocked our market-book
consumer from picking up the 79 update until 16:20:49.
Our backend cache and Redis both show price=79 now (correct). The issue isn't message loss — it's
processing latency caused by catalogue floods during recovery.
We're working on a fix to prevent catalogue processing from blocking live price updates. In the
meantime — is there an API option to request only changed/new catalogues since a given timestamp,
instead of all catalogues?
**Michael Cheremuhin** — 10:10 PM
no, i'm afraid we don't have it as it's expected to be a stream of data consumed constantly without breaking the updates
**Michael Cheremuhin** — 10:11 PM
in most cases you don't need to recover everything constantly
**Michael Cheremuhin** — 10:12 PM
can you please remind the reason for triggering recovery flow as a part of normal system work?
**Bhargav** — 10:29 PM
The reason we run recovery every 10 minutes: from our initial integration, we observed that only 1.x
MATCH_ODDS data was arriving via RabbitMQ push. 9.x fancy and 14.x sportsbook markets were only
appearing after we triggered recovery. So we assumed the stream only delivers real-time price updates
for markets already known to us.
Based on that, we set up periodic recovery to catch:
1. New fixtures appearing during the day
2. New fancy/session markets (9.x) opening mid-match
3. New sportsbook markets (14.x) opening
4. Phantom sub-events (Bifrost splits sportsbook + fancy under separate event IDs)
This periodic recovery is what's causing the delay — each cycle triggers ~12,000 messages (catalogues
+ market books, even though we send includeMarketBook: false), which blocks our consumer from
processing live price updates for ~5 minutes.
If the stream is designed to deliver everything continuously without needing recovery, we can remove
periodic recovery and only recover on startup/reconnect. Can you confirm whether the stream sends:
1. New events when they're created?
2. New market catalogues when a market opens (9.x fancy, 14.x sportsbook)?
3. Market books for newly opened markets?
4. Also — we're sending includeMarketBook: false in our periodic recovery call, but still receiving
~8,000 market book messages. Is the includeMarketBook flag supported/respected by the recovery API?
**Bhargav** — 10:30 PM
We did this assuming pre prod APIs will work similar to prod APis and when we did not see the markets we implemented this recovery as fallback
**Michael Cheremuhin** — 10:36 PM
1. New events when they're created? > yes, events are sent out immediately without need of recovery
2. New market catalogues when a market opens (9.x fancy, 14.x sportsbook)? > we send both market catalogue and market book immediately, but they sit in different queues so might be consumed together on your side. as a general recommendation we recommend keeping book and catalogues together consider the market to be valid for membersite only when both parts are consumed
3. Market books for newly opened markets? > check pt.2, the same applies for market books. once markets are created, the OPEN/NOT OPEN market status is controlled through market book messages
4. we're sending includeMarketBook: false in our periodic recovery call, but still receiving. ~8,000 market book messages. Is the includeMarketBook flag supported/respected by the recovery API? > yes, it should filter out
i'd recommend keeping the recovery flow, but not trigger it for normal data flow. use it manually or semi-manually only after deployments on your side (if it takes more then 2 hours) or data loss/corruption. it's better to have the way to recover, but you don't need to do it constantly
**Michael Cheremuhin** — 10:37 PM
please let me know once auto recovery logic disabled so I can run more pre-check tests
**Bhargav** — 11:05 PM
Hey @Michael Cheremuhin
auto-recovery is now disabled on bhdev. Here's what changed:
- Removed the 10-minute periodic recoverEvents('periodic') — no more queue floods
- Kept startup recovery (cold start / reconnect only)
- Kept the 30s phantom linker (local cache operation, no API calls)
- Added manual recovery endpoint (POST /api/admin/bifrost/recover) for use after
deployments or data loss
- Added market validity rule: markets are only served to the membersite when both
catalogue AND book exist
Ready for your pre-check tests. Let us know how it goes.
**Michael Cheremuhin** — 11:24 PM
sounds great. let us proceed with checking
**Michael Cheremuhin** — 11:45 PM
i've picked a moment with no stacked updates:
**Michael Cheremuhin** — 11:45 PM
📎 image.png
**Michael Cheremuhin** — 11:45 PM
and made two price changes:
**Michael Cheremuhin** — 11:45 PM
85:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 85,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 102,
"maxStake": 1960.78,
"maxStakeCurrencies": {
"hkd": 1960.78,
"aed": 925,
"eur": 225,
"bdt": 30635,
"gbp": 190,
"rmb": 1795,
"usd": 250,
"inr": 21785
}
}
]
},
"version": "1772475254011"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 99,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 118,
"maxStake": 1694.91,
"maxStakeCurrencies": {
"hkd": 1694.91,
"aed": 800,
"eur": 195,
"bdt": 26480,
"gbp": 165,
"rmb": 1550,
"usd": 215,
"inr": 18830
}
}
]
},
"version": "1772475254011"
}
],
"version": "1772475254081",
"sportId": "2"
}```
**Michael Cheremuhin** — 11:45 PM
and 82:
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 82,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 96,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
]
},
"version": "1772475265766"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 104,
"maxStake": 1923.07,
"maxStakeCurrencies": {
"hkd": 1923.07,
"aed": 910,
"eur": 220,
"bdt": 30045,
"gbp": 190,
"rmb": 1760,
"usd": 245,
"inr": 21365
}
}
],
"availableToLay": [
{
"price": 122,
"maxStake": 1639.34,
"maxStakeCurrencies": {
"hkd": 1639.34,
"aed": 775,
"eur": 190,
"bdt": 25610,
"gbp": 160,
"rmb": 1500,
"usd": 210,
"inr": 18210
}
}
]
},
"version": "1772475265766"
}
],
"version": "1772475265844",
"sportId": "2"
}```
**Michael Cheremuhin** — 11:46 PM
both messages seems to be sent to you according to rabbimtq screen, but your membersize looks frozen with 85 skipping last update to 82
**Michael Cheremuhin** — 11:46 PM
can you please check what happened
**Bhargav** — 12:43 AM
found and fixed the issue. The throttle was grouping all markets
under one fixture into a single bucket, so rapid updates on the same market were
getting dropped. Fixed it to throttle per market instead.
**Bhargav** — 12:44 AM
@Michael Cheremuhin
**Bhargav** — 12:53 AM
i've picked a moment with no stacked updates -> is this good? or do we need any further optimizations here?
**Michael Cheremuhin** — 1:40 AM
still something there. the last update didn't apply (81 to 89):
**Michael Cheremuhin** — 1:40 AM
```{
"marketId": "9.2259358",
"marketStatus": "OPEN",
"maxMarket": 30000,
"maxMarketCurrencies": {
"hkd": 30000,
"aed": 14215,
"eur": 3495,
"bdt": 468750,
"gbp": 2980,
"rmb": 27520,
"usd": 3845,
"inr": 333330
},
"runner": [
{
"id": "3664839",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 89,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 106,
"maxStake": 1886.79,
"maxStakeCurrencies": {
"hkd": 1886.79,
"aed": 890,
"eur": 215,
"bdt": 29480,
"gbp": 185,
"rmb": 1730,
"usd": 240,
"inr": 20960
}
}
]
},
"version": "1772482177757"
},
{
"id": "3664840",
"status": "ACTIVE",
"priceLadder": {
"availableToBack": [
{
"price": 95,
"maxStake": 2000,
"maxStakeCurrencies": {
"hkd": 2000,
"aed": 945,
"eur": 230,
"bdt": 31250,
"gbp": 195,
"rmb": 1830,
"usd": 255,
"inr": 22220
}
}
],
"availableToLay": [
{
"price": 113,
"maxStake": 1769.91,
"maxStakeCurrencies": {
"hkd": 1769.91,
"aed": 835,
"eur": 205,
"bdt": 27650,
"gbp": 175,
"rmb": 1620,
"usd": 225,
"inr": 19665
}
}
]
},
"version": "1772482177757"
}
],
"version": "1772482177826",
"sportId": "2"
}```
**Michael Cheremuhin** — 1:40 AM
can see you have two consumers:
**Michael Cheremuhin** — 1:40 AM
📎 image.png
**Michael Cheremuhin** — 1:40 AM
potentially might be multiple envs stealing the updates?
**Michael Cheremuhin** — 1:41 AM
did apply to 89 (looks like some partial recovery, not sure). then updated to 84 and it didn't apply
**Michael Cheremuhin** — 1:42 AM
now something next - I don't see max stake to be shown to members, which is not ok as members can't place above that limit
**Michael Cheremuhin** — 1:44 AM
the is maxStakeCurrencies map, where key is the currency (you need to take hkd if you work with hkd). it need to show that limit to members and also validate the bets and if it exceeds the limit - do not allow that bet as it won't be accepted on our end
📎 image.png
**Michael Cheremuhin** — 1:46 AM
seems like you have that updates stealing issue, as i've open 2 inning runs markets and then updated the lines for one of them, but only one is shown with old lines:
**Michael Cheremuhin** — 1:46 AM
📎 image.png
**Michael Cheremuhin** — 1:46 AM
📎 image.png
**Michael Cheremuhin** — 1:48 AM
please fix the udates and add max stake. once it's done, i will confirm and will proceed with smoke testing bet placement, settlement and resettlement flows, as well as bets voiding. once this all is done, will pass further to conformance team
**Michael Cheremuhin** — 1:48 AM
@Bhargav
**Badal Agrawal** — 10:07 AM
@Michael Cheremuhin I see max being shown to the users already. Are you talking about something else?
CC: @Bhargav
📎 image.png
**Badal Agrawal** — 10:10 AM
@Bhargav https://suntechinnovation.slack.com/archives/C0AF0JC4RB7/p1772482581240829?thread_ts=1772444879.060309&cid=C0AF0JC4RB7
This should help in debugging.
**Bhargav** — 12:05 PM
Thanks @Michael Cheremuhin — we found and fixed two separate issues.
1) Update stealing root cause:
We had two backend environments consuming the same Bifrost queue prefix (`forsyt.*`) on our side, so messages were split between consumers. We have now disabled Bifrost consumption on the extra backend, so only bhdev is consuming.
2) Max stake + update sync:
We fixed max-stake handling to use the live side-specific ladder values (from `maxStakeCurrencies.HKD`) and synced stake limits correctly on live WS updates. We also fixed zero-liquidity edge handling so a `0` max stake is respected (not treated as unlimited).
Fixes are now deployed on [bhdev.forsyt.io](http://bhdev.forsyt.io)
Could you please re-test:
- rapid line updates on the same market (e.g. 81 → 89 → 84),
- parallel updates across two inning-runs markets,
- max stake display and rejection when bet stake exceeds max?
Let us know if there are any new findings.
Bhargav — 3:35 PM
Hi @Michael Cheremuhin Continuing @Prashant Malik chat from our previous thread, Can you please share updates/reports on the testing you have done.
Thread (2 replies):
Michael Cheremuhin — 3:36 PM conformance team returned the integration back to me so I check the updates to be applying correctly before returning back to them. they can't proceed while updates are not fully applying
Michael Cheremuhin — 3:37 PM @Bhargav i've provided the details in https://suntechinnovation.slack.com/archives/C0AF0JC4RB7/p1772444879060309