Produktions feed, ofullständiga json object i trade

Added by Vincent 6 months ago

Hej!

Applikationen som mottar feeds är byggd i C#.

Nu har jag upptäckt att ibland får jag ofullständiga json object om en feed innehåller för mycket text, den klipper efter 1460 tecken och skickar resten i nästa feed.
Efterkommande feed med saknade delen av föregående feed kan innehålla mer än 1460 tecken utan problem

Min egen kod har en buffert på 4096 bytes för mottagande data, även testat med 8192 bytes och mer, men får samma fel

Skickar med fil, lättast å se detta i Notepad++
LF är från feed
CRLF har jag lagt för avgränsning när båda feed är hopslagna
@ avgränsar brytningen

Har löst problemet i min kod, men känns ändå inte som att det ska göras där.
Undrar också om någon annan har samma problem?

Mvh.
Vinc


Replies (12)

RE: Produktions feed, ofullständiga json object i trade - Added by Nordnet Henrik 6 months ago

Hej Vincent,

Det låter som ett riktigt bekymmer. För att forumet ska kunna hjälpa dig är mitt tips att du visar din kod och hur du har löst det så kan andra lättare hjälpa dig.

Mvh,
Henrik

RE: Produktions feed, ofullständiga json object i trade - Added by Vincent 6 months ago

Hej Henrik!

Jag undrar mer om det är en bugg i Nordnet's feed.

Koden som används är tcpclient som ligger på msdn, förutom då ändringen på bufferten till ett högre värde för att kunna hantera feed's med mer data än 2048 bytes.
https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx

Har testat med att ändra min egen buffert till 512 bytes och då klipper den på min sida och det är inget konstigt, för tillfället är den 8192 bytes, men feed'n från nordnet krånglar när det är mer än 1460 byte, vilket då klipper json objekt lite hur som helst beroende på hur långa de andra objekten är.

En feed med för många tecken, vid 1460 så skickas resten i nästa feed {"type":"trade",<...>,"trade_timestamp":1528702638251,"t

nästa feed som kommer när föregående inte är komplett, denna kan däremot innehålla mer än 1460 tecken.
rade_type":"AUTO","trade_id":"000066355","price":62.92,"volume":669}}

Mvh.
Vincent

RE: Produktions feed, ofullständiga json object i trade - Added by Peter 6 months ago

Hej!
Samma problem här. Samma sak i övrigt också, löser det på min sida, C#, samma exempel från msdn och har också provat olika storlekar på bufferten.

Är för lat för att rota i det nu men följer denna tråd med intresse :)

Med vänlig hälsning,
Peter

RE: Produktions feed, ofullständiga json object i trade - Added by Vincent 6 months ago

Hej Peter!
Tackar för inputen.
Intressant om det är andra som har samma problem, oberoende om det är C#, hur ser det ut för er som använder Node.js, Java, C++ etc?

Jag har analyserat vad som händer och värst är det vid öppning och stängnings callen.
Max mängd data som skickas från Nordnet's feed är 16384 bytes, där av så har jag satt min till det dubbla :)

Vid öppning och stängning är det jätte många feeds som bryts vid 1460 bytes, sen när max gränsen nås så blir det ännu mer intressantare.
Det uppstår samma problem under dagen också men inte lika ofta.

Exempel vid öppning och stängnings callen.
Feeds som bryts vid 1460 bytes, och vid olika punkter i objekten. Brytningen sker precis vart som helst i ett objekt.

Delar av objekt som skickas i olika feeds. {"type":"trade",<...>"trade_timestamp":1528441280925,"trade_type":"A
UTO","trade_id":"000015687","price":84.60,"volume":192}}

{"type":"trade",<...>"trade_timestamp":1528441280925,"trade_type":"AUTO","trade_id":"000015691","price":350.3
0,"volume":2621,"broker_buying":"NRD"}}

{"type":"trade",<...>"trade_timestamp":1528441280925,"trade_type":"AUTO","trade_id":"000015690","price":84.60,"volume":995}
}

<...>{
"type":"trade","data":{"i":"220","m":11,"id":16102499,"trade_timestamp":1528441280925,"trade_type":"AUTO","trade_id":"000015688","price":84.60,"volume":803,"broker_buying":"NON"}}

När vi sen når maxgränsen kan det se ut på följande vis.
Först en som bryts vis 1460, får vi inget komplett objekt i slutet {"type":"trade",<...>"trade_timestamp":1528

Första feed som nått maxgränsen, fel i både första och sista objektet
441280926,"trade_type":"AUTO","trade_id":"000015696","price":362.00,"volume":500,"broker_buying":"SWB"}} {"type":"trade"<...>"price":362.00,

Andra feed som nått maxgräns, fel i både första och sista objektet
"volume":15,"broker_buying":"SWB"}} {"type":"trade"<...>"price":362.00,"volume":102,"broker_buying":"S

Feed tre ligger under maxgränsen, fel i första objektet men sista objektet är rätt.
WB"}} {"type":"trade"<...>"price":153.80,"volume":1,"broker_buying":"NON"}}

Data som jag visar här är klipp å klistrat för att korta ner hur det ser ut, där är också förklaringen till varför trade_id ser ut som det gör och inget att haka upp sig på.

RE: Produktions feed, ofullständiga json object i trade - Added by Herman 6 months ago

Kan meddela att det är samma i Python 3+, gjorde några tester och ibland fylls inte min buffert ut helt. Kan se att den blir maxad o h Sen blir infon kapad men i andra fall kan jag få tex 100bytes och sen kapas infon. Sker även vid EOD-data och inte bara under realtid.

RE: Produktions feed, ofullständiga json object i trade - Added by Nordnet Henrik 6 months ago

Hej Vincent och Herman,

Ni verkar ha detta problem. För att kunna felsöka behöver jag svar på ett par frågor.

1) Är detta ett nytt problem eller är det något som har skett återkommande med produktion (inte Test-systemet)?

2) Vincent och Herman vad är Era användarnamn för API:et? Ni hittar Era användarnamn under "Mitt konto" längst till höger.

3) När under dagen sker detta? Ni har nämnt vid öppning och stängning? Händer det flera gånger per dag, är det varje dag?

4) Har ni testat att prenumera på något annat "feed" än "trades"? Har ni testat "news" eller "price"?

Mvh,
Henrik

RE: Produktions feed, ofullständiga json object i trade - Added by Nordnet Henrik 5 months ago

PS. Ett tillägg

Alla JSON-objekt som skickas är avslutade med en nyrad. Tänker ni på detta när ni läser in bytarna som ni får?

Mvh,
Henrik

RE: Produktions feed, ofullständiga json object i trade - Added by Niklas 5 months ago

Jag hade samma problem i min kod, men det berodde på ett fel i hur jag hanterade bufferten.
Att meddelandet avbryt olämpligt när bufferten är slut är väll helt ok, man måste bara ha en funktion som bygger ihop strängarna från bufferten och sen delar strängen efter CRLF. Och då får man hela json objekt.

RE: Produktions feed, ofullständiga json object i trade - Added by Vincent 5 months ago

Hej Henrik!

Det är inte bara jag och Herman som har problem, utan Peter också.
Fortfarande har detta inte med buffert på mottagande sida att göra, se tidigare inlägg, enligt analys så är max mängddata från Nordnet 16384 bytes, men endast efterkommande vid feed som blivit klippt vid 1460 bytes.

Svar på tidigare frågor.

1) Är detta ett nytt problem eller är det något som har skett återkommande med produktion (inte Test-systemet)?
Ända sen jag fick tillgång till prod så har jag haft detta problem, i test miljön har jag inte testat om jag får samma fel. Ska göra det vid något tillfälle.

2) Vincent och Herman vad är Era användarnamn för API:et? Ni hittar Era användarnamn under "Mitt konto" längst till höger.
Se svar längre ned istället för testning.

3) När under dagen sker detta? Ni har nämnt vid öppning och stängning? Händer det flera gånger per dag, är det varje dag?
Det händer varje dag, och när som helst under dagen, värst är det vid öppning och stängning.
Se inlägg fem.

4) Har ni testat att prenumera på något annat "feed" än "trades"? Har ni testat "news" eller "price"?
Nej, i dagsläget är inte det intressant.

Från Henrik:
PS. Ett tillägg

Alla JSON-objekt som skickas är avslutade med en nyrad. Tänker ni på detta när ni läser in bytarna som ni får?
Jepp, vet om detta. Se text i första inlägget.

@Henrik:
Enklaste du kan göra är å testa om du får hela feeds från Nordnet.
Du måste lyssna på rätt många instrument innan problem uppstår, själv ligger jag på 93 instrument.

Använd samma kod som mig och Peter, https://msdn.microsoft.com/en-us/library/system.net.security.sslstream(v=vs.110).aspx

Lägg till följande rad i koden som lyssnar på servern, i slutet på do-while loopen i ReadMessage(SslStream sslStream).

File.AppendAllText("BrokenFeeds_" + DateTime.Now.ToString("yyyyMMdd") + ".txt", messageData.ToString() + "@");

Kör du denna så får du många brutna feeds vid öppning och stängning, du får även brutna feeds under dagen, men det beror helt å hållet på hur mycket tryck det är i handeln.
Vänta 20 min och sen öppna filen i Notepad++ så ser du vart @ hamnar.

Sparar man feeds till fil så uppstår inte några problem, utan felen uppstår bara när du vill hantera feeds i realtid.
Varför det inte blir några fel när det sparas till fil är på grund av att när feed'n blir klippt då finns det inte någon LF i slutet, när nästa feed läggs till så fortsätter den där förra blev klippt.

RE: Produktions feed, ofullständiga json object i trade - Added by Peter 5 months ago

Hej igen!
Jag hade missat att all json avslutas med ny rad ('\n'), tack Nordnet Henrik!. Nu använder jag en StringBuilder som bygger på tills '\n' kommer och när det händer så skickar jag vidare den json jag fått. Har provat i några dagar utan att få några fel. Men jag prenumererar bara på 16 instrument just nu så jag vet inte om det är tillförlitligt.

Med vänlig hälsning
/Peter

RE: Produktions feed, ofullständiga json object i trade - Added by Nordnet Henrik 5 months ago

Hej Peter,

Vad kul att det funkar bra. Jag ber om ursäkt om vi har varit trubbig kring hur objekten ser ut.

PS. Om det funkar för 16 instrument borde inte vara några större problem att skala upp.

Mvh,
Henrik

RE: Produktions feed, ofullständiga json object i trade - Added by Vincent 5 months ago

Hej Henrik!

Återigen, hur svårt kan det vara.
När du prenumererar på tillräckligt många instrument så kommer feed'n till slut vid vissa tillfällen överskrida 1460 och då klipps och resten skickas i nästkommande feed's.

Exempel där varje feed har lagrats i en databas. Med andra ord, ingen bearbetning överhuvudtaget, utan får feed och direkt till databasen. Lokal buffert är satt till 32768 bytes

Data är från stängningscallen den 20 juli

Första kolumnen är hur lång feed'n är, och andra är då objekten som finns i feed'n
[inga externa länkar]

(1-12/12)