Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ขอรบกวนตัวอย่างการใช้งาน [x] - Request, Respond อีกนิดนะครับ #6

Closed
MisterKon opened this issue Apr 24, 2020 · 6 comments

Comments

@MisterKon
Copy link

ผมเจอเคสที่ publish ไปแล้วไม่รู้เลยว่า subscribe ได้รับ msg หรือเปล่า ผมจะเอา [x] - Request, Respond ตัวนี้มาใช้ได้ไหมครับ ถ้าได้รบกวนท่านอาจารย์ด้วยนะครับ

@chartchuo
Copy link
Owner

ปกติไม่แนะนำให้การตรวจสอบว่าข้อมูลไปถึง subscriber โดย publisher เพราะเป็นภาระที่เยอะเกินไปโดยเฉพาะถ้ามี sub จำนวนมาก ถ้าเป็นไปได้ทำที่ sub ดีกว่า สิ่งที่ต้องทำคือ
1 กำหนด message format แนะนำให้ใช้ json encoder
2 กำหนด ให้มี message ID ทุกครั้งที่ pin จะเพิ่ม id ขึ้น 1
3 กำหนด keep alive เช่น x วินาที ถ้าไม่มีข้อมูลใหม่ให้ส่งข้อความเปล่า ๆ ID ใหม่
4 server ต้องเก็บข้อความย้อนหลัง เพื่อให้เรียกข้อมูลย้อนหลังได้
5 ถ้า sub ได้รับ ข้อความกระโดดข้ามแสดงว่าข้อมูลหายระหว่างทาง ให้ใช้ request response ขอข้อมูลเฉพาะ message id นั้นจาก pub
6 ถ้า sub ไม่ได้ข้อมูล ในเวลา 2x ให้ขอข้อมูล โดยใช้ request response

หวังว่าจะช่วยได้ คำตอบนะครับ

@chartchuo
Copy link
Owner

ลองดูตัวอย่างใน test file ได้ครับ

@MisterKon
Copy link
Author

สวัสดีครับ Project ผมยังไม่เสร็จเลย ฮือๆ ยังติดที่ package นี้อีกนิด คือ ผมเจอปัญหาเวลาส่ง message ที่มีข้อความใหญ่ เช่น ขนาดประมาณ 1,000 ตัวอักษรขึ้นไป sub จะหลุดไปเลยต้อง connect แล้ว sub ใหม่
ไม่ทราบว่า message มี limit ที่ขนาดเท่าไหร่ ผมลงค้นๆดูเห็นว่ารับได้ถึง 1mb ก็เลยลองหาดูว่ามันไปติดตรงไปไหน พบว่ามันหลุดไปตรง ที่
file client.dart บรรทัด 216 if (_buffer.length < length) return; คือ ครั้งแรกๆ บางทีก็ทำงานปกติ แต่สัก 3-4 message ขึ้นไปก็หลุด ซึ่ง _buffer.length มันได้ข้อมูลไม่ครบมาตั้งแต่ บรรทัด 105 _socket.listen((d) { แล้วน่ะครับ แต่ length = int.parse(s[3]); อันนี้อ่านค่าได้ถูกต้อง

ถ้าข้อความน้อยๆ หรือ ไม่เกิน 1,000 ตัวอักษร ทำได้ปกติดีเลย แต่บาง chat มัน copy ข้อความเยอะๆมาส่ง ทำให้ sub หลุดไป ผมลองกับ natsClient.connect('demo.nats.io'); จะส่งข้อความจำนวนมากได้หลาย message แต่ก็ไม่เกิน 10 message ผลก็หลุด sub เหมือนกันครับ

<" ผมพยายามจะลองแก้ไขด้วยตัวเองแต่หมดความสามารถแล้วครับ

testMsg ='12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';

@chartchuo
Copy link
Owner

ขอโทษที่หายไปครับ พอดีผมติดงานหนักมาก ไม่ได้เข้ามาดูเลย พอดีมี project ที่ต้องใช้ lib เจอ defect ด้วยตัวเองบ้างนิดหน่อย ที่ request response เหมือนกันด้วย เดี๋ยวดูแก้ไปพร้อมกันเลยครับ ยังไงผมขอ ตัวอย่าง source ที่ generate error ด้วยครับ เอาชนิด main.dart file เดียว reproduce ปัญหาได้เลยครับ

@chartchuo
Copy link
Owner

ผมลง ด้วย test program
test('long message', () async {
var txt =
'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
var client = Client();
await client.connect('localhost', retryInterval: 1);
var sub = client.sub('subject1');
client.pub('subject1', Uint8List.fromList(txt.codeUnits));
client.pub('subject1', Uint8List.fromList(txt.codeUnits));
var msg = await sub.stream.first;
print(msg.data);
msg = await sub.stream.first;
print(msg.data);
client.close();
expect(String.fromCharCodes(msg.data), equals(txt));
});

ผ่านครับ แต่เจอว่า request response มันจัดการ broadcast stream ผิด ทำให้รับ message ได้คร้งเดียว แล้วจะ error ผมแก้ไขแล้ว ยังไงวันนี้จะ upload ขึ้น pub ไม่ได้ใช้นานลืมวิธีไปแล้ว 5555+

แต่ไม่อยากรอก็ เรียก library จาก github โดยตรงก็ได้ครับเพราะผมเอาขึ้น github แล้ว

@chartchuo
Copy link
Owner

ขอตัวอย่าง .dart จะดีที่สุดครับ จะได้ reproduce ปัญหาได้ครับ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants