Releases: nats-io/nats.py
Release v2.1.6
Fixed
- Fixed
SlowConsumerError
that would appear when usingasync for msg in sub.messages
after reaching default pending bytes limit
Release v2.1.5
Added
- Added
pending_msgs_limit
andpending_bytes_limit
can now be set for push and pull consumers from JetStream. To disable limits-1
can be used instead:
# Push Subscriber
await js.subscribe("push-example", pending_bytes_limit=-1, pending_msgs_limit=-1)
# Pull Subscriber
await js.pull_subscribe("pull-example", "durable", pending_msgs_limit=-1, pending_bytes_limit=-1)
- Added
sub.pending_bytes
andsub.pending_msgs
methods to confirm buffered bytes and messages from a Subscription
Fixed
-
Fixed accounting bug when using
sub.next_msg
which would have caused SlowConsumer errors and dropping messages when reaching default limit -
Fixed empty message being returned sometimes when calling
sub.next_msg
after future was cancelled
Release v2.1.4
Release v2.1.3
Fixes
- Fixes to headers parser when handling empty keys
Release v2.1.2
Added
- Added more methods to the
JetStreamManager
(#315) - Added validation to subject and queue for
subscribe
(#302)
Changed
- Changed
sub.Fetch
to not block until all messages arrive, it now yields when there are some pending and handle new 4XX temporary status sent by the server
Fixed
- Fixed ssl_context referenced before assignment (#292) by @marianojabdala
- Fixed
cluster
should be optional inPlacement
class (#310) by @olgeni - Fixed cancelling
next_msg()
does not cancel internal_next_msg()
task (#301)
Release v2.1.0
Added
- Added
pending_size
option on connect to set max internal pending size for flushing commands and aflush_timeout
option to control the maximum time to wait for a flush.
For example to set it to 2MB only which is the default:
nats.connect(pending_size=2*1024*1024)
And similar to the nats.go client, it can be disabled if set to be negative:
nats.connect(pending_size=-1)
When pending size is disabled, then any published message during a disconnection will result in a synchronous OutboundBufferLimitError
thrown when publishing.
To control the flushing there is a flush_timeout
option that can be passed on connect as well.
nats.connect(flush_timeout=10)
By default, there is no flush timeout (it is None
) so the client can wait indefinitely during a flush similar to nats.go (eventually the ping interval ought to unblock the flushing). These couple of changes also improve the publishing performance of the client, thanks to @charbonnierg for contributing to this issue.
- JetStream: Added NAK delay support (#268, thanks @databasedav for the contribution)
- Added custom inbox prefix option (https://github.com/nats-io/nats.py/pull/276/files thanks @YiuRULE for the contribution!)
Fixed
Changed
-
Changed
nc.flush()
to now throwFlushTimeoutError
instead which is a subtype ofTimeoutError
that it used be using for backwards compatibility. -
Changed EOF disconnections being reported as
StaleConnectionError
and they are instead aUnexpectedEOF
error.
Release v2.0.0
nats.py v2.0.0
Major upgrade to the APIs of the Python3 client. For this release the client has also been renamed to be nats-py
from asyncio-nats-client
, it can now be installed with:
pip install nats-py
# With NKEYS / JWT support
pip install nats-py[nkeys]
This version of the client is not completely compatible with previous versions of the client and it is designed to be used with Python 3.7.
Overall, the API of the client should resemble more the APIs of the Go client:
import nats
async def main():
nc = await nats.connect("demo.nats.io")
sub = await nc.subscribe("hello")
await nc.publish("hello")
msg = await sub.next_msg()
print(f"Received [{msg.subject}]: {msg.data}")
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
There is support for NATS Headers ⚡
import asyncio
import nats
from nats.errors import TimeoutError
async def main():
nc = await nats.connect("demo.nats.io")
async def help_request(msg):
print(f"Received a message on '{msg.subject} {msg.reply}': {msg.data.decode()}")
print("Headers", msg.header)
await msg.respond(b'OK')
sub = await nc.subscribe("hello", "workers", help_request)
try:
response = await nc.request("help", b'help me', timeout=0.5)
print("Received response: {message}".format(
message=response.data.decode()))
except TimeoutError:
print("Request timed out")
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
It also now includes JetStream
support:
import asyncio
import nats
async def main():
nc = await nats.connect("demo.nats.io")
# Create JetStream context.
js = nc.jetstream()
# Persist messages on 'foo' subject.
await js.add_stream(name="sample-stream", subjects=["foo"])
for i in range(0, 10):
ack = await js.publish("foo", f"hello world: {i}".encode())
print(ack)
# Create pull based consumer on 'foo'.
psub = await js.pull_subscribe("foo", "psub")
# Fetch and ack messagess from consumer.
for i in range(0, 10):
msgs = await psub.fetch()
for msg in msgs:
print(msg)
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
As well as JetStream KV
support:
import asyncio
import nats
async def main():
nc = await nats.connect()
js = nc.jetstream()
# Create a KV
kv = await js.create_key_value(bucket='MY_KV')
# Set and retrieve a value
await kv.put('hello', b'world')
entry = await kv.get('hello')
print(f'KeyValue.Entry: key={entry.key}, value={entry.value}')
# KeyValue.Entry: key=hello, value=world
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
New Documentation site:
The following site has been created to host the API of the Python3 client: https://nats-io.github.io/nats.py/
The contents of the doc site can be found in the following branch from this same repo: https://github.com/nats-io/nats.py/tree/docs/source
Breaking changes
-
Changed the return type of
subscribe
instead of returning a sid. -
Changed suffix of most errors to follow PEP-8 style and now use the
Error
suffix. For example,ErrSlowConsumer
is nowSlowConsumerError
. Old style errors are subclasses of the new ones so exceptions undertry...catch
blocks would be still caught.
Deprecated
Several areas of the client got deprecated in this release:
- Deprecated
is_async
parameter forsubscribe
- Deprecated
Client.timed_request
- Deprecated passing
loop
parameter to most functions - Deprecated
auto_unsubscribe
instead preferringsub.unsubscribe
Thanks
Special thanks to @brianshannan @charliestrawn @orsinium @charbonnierg for their contributions in this release!
Release v0.11.5
Bugfix release that includes #230
Release v2.0.0rc1
nats.py v2.0.0rc1
Major upgrade to the APIs of the Python3 client! For this release the client has also been renamed to be nats-py
from asyncio-nats-client
, it can now be installed with:
pip install nats-py
# With NKEYS / JWT support
pip install nats-py[nkeys]
This version of the client is not completely compatible with previous versions
of the client and it is designed to be used with Python 3.7.
Overall, the API of the client should resemble more the APIs of the Go client:
import nats
async def main():
nc = await nats.connect("demo.nats.io")
sub = await nc.subscribe("hello")
await nc.publish("hello")
msg = await sub.next_msg()
print(f"Received [{msg.subject}]: {msg.data}")
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
There is support for NATS Headers ⚡
import asyncio
import nats
from nats.errors import TimeoutError
async def main():
nc = await nats.connect("demo.nats.io")
async def help_request(msg):
print(f"Received a message on '{msg.subject} {msg.reply}': {msg.data.decode()}")
print("Headers", msg.header)
await msg.respond(b'OK')
sub = await nc.subscribe("hello", "workers", help_request)
try:
response = await nc.request("help", b'help me', timeout=0.5)
print("Received response: {message}".format(
message=response.data.decode()))
except TimeoutError:
print("Request timed out")
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
It also now includes JetStream
support:
import asyncio
import nats
async def main():
nc = await nats.connect("demo.nats.io")
# Create JetStream context.
js = nc.jetstream()
# Persist messages on 'foo' subject.
await js.add_stream(name="sample-stream", subjects=["foo"])
for i in range(0, 10):
ack = await js.publish("foo", f"hello world: {i}".encode())
print(ack)
# Create pull based consumer on 'foo'.
psub = await js.pull_subscribe("foo", "psub")
# Fetch and ack messagess from consumer.
for i in range(0, 10):
msgs = await psub.fetch()
for msg in msgs:
print(msg)
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
As well as JetStream KV
support:
import asyncio
import nats
async def main():
nc = await nats.connect()
js = nc.jetstream()
# Create a KV
kv = await js.create_key_value(bucket='MY_KV')
# Set and retrieve a value
await kv.put('hello', b'world')
entry = await kv.get('hello')
print(f'KeyValue.Entry: key={entry.key}, value={entry.value}')
# KeyValue.Entry: key=hello, value=world
await nc.close()
if __name__ == '__main__':
asyncio.run(main())
New Documentation site:
The following site has been created to host the API of the Python3 client: https://nats-io.github.io/nats.py/
The contents of the doc site can be found in the following branch from this same repo: https://github.com/nats-io/nats.py/tree/docs/source
Breaking changes
-
Changed the return type of
subscribe
instead of returning a sid. -
Changed suffix of most errors to follow PEP-8 style and now use the
Error
suffix. For example,ErrSlowConsumer
is nowSlowConsumerError
. Old style errors are subclasses of the new ones so exceptions undertry...catch
blocks would be still caught.
Deprecated
Several areas of the client got deprecated in this release:
-
Deprecated
is_async
parameter forsubscribe
-
Deprecated
Client.timed_request
-
Deprecated passing
loop
parameter to most functions
Release v0.11.4
Fixed
- Fixed issue of NATS client not reconnecting to NATS Server nodes behind LB #189