Last active
June 27, 2024 15:55
-
-
Save HelloGrayson/ca4f6b9c17861327aa8a to your computer and use it in GitHub Desktop.
tchannel .call api change
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# raw | |
response = yield tchannel.call( | |
argscheme="raw", | |
service="someservice", | |
endpoint="something", | |
body="RAWRESPONSE", | |
headers={ | |
'X-Source': 'geo' | |
}, | |
ttl=1000 | |
) | |
# json | |
response = yield tchannel.call( | |
argscheme = "json" | |
service="someservice", | |
endpoint="maps", | |
body="{ | |
'lat': 100, | |
'lng': 140 | |
}", | |
headers={ | |
'X-Source': 'geo' | |
}, | |
ttl=1000 | |
) | |
# thrift | |
Foo = get_tchannel_thrift(FooThrift, 'fooservice') | |
response = yield tchannel.call( | |
argscheme="thrift", | |
"some_binary", | |
headers={ | |
'X-Source': 'geo' | |
}, | |
ttl=1000 | |
) | |
response = yield tchannel.call_thrift( | |
Foo.getBar(Foo.BarResponse("hi")), | |
headers={ | |
'X-Source': 'geo' | |
}, | |
timeout=5000 | |
) | |
response = yield tchannel.as_thrift().call( | |
Foo.getBar(Foo.BarResponse("hi")), | |
headers={ | |
'X-Source': 'geo' | |
}, | |
timeout=5000 | |
) | |
response = yield tchannel.thrift.call( | |
Foo.getBar(Foo.BarResponse("hi")), | |
headers={ | |
'X-Source': 'geo' | |
}, | |
timeout=5000 | |
) | |
future = tchannel_sync.call( | |
Foo.baz(True), | |
headers={ | |
'X-Source': 'geo' | |
}, | |
ttl=1000 | |
) |
Wow. no Finagle.
Based on discussion earlier, this is how we expect the client-side streaming API to look:
Response streaming
We'll introduce a stream
method on the TChannel
object and its argscheme-specific proxies that will accept the same arguments as call
. Instead of a standard response, it'll return a streaming response object which provides a .read()
method.
response = tchannel.stream(service='foo', endpoint='bar', body='listItems')
headers = response.headers
try:
while True:
chunk = yield response.read()
process(chunk)
except EndOfStream:
pass
Request streaming
We'll have a body_producer
parameter on both call
and stream
. body_producer
may be passed in lieu of the body
. It will be a function that accepts a write
function and calls it to write to the stream. The function must be a coroutine, or return a function that resolves to None when it finishes writing.
@gen.coroutine
def producer(write):
for line in some_file:
yield write(line)
response = yield tchannel.call(endpoint='foo', service='bar', body_producer=producer)
# Bidirectional streaming:
response = yield tchannel.stream(endpoint='foo', service='bar', body_producer=producer)
try:
while True:
chunk = yield response.read()
process(chunk)
except EndOfStream:
pass
Suggestion: make the streamed response iterable, e.g. for thing in response
.
@blampe +1
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Finagle's is brutal:
So with a trace filter they can set zipkin headers for each request.
sources: