我正在尝试针对本地模拟 pubsub 服务器使用Go pubsub 库。我发现“旧样式”(已弃用)函数(例如and )可以正常工作,但“新样式”API(例如and )无法按预期工作。CreateSub
PullWait
Iterators
SubscriptionHandles
我编写了两个不同的单元测试,它们都测试相同的动作序列,一个使用“新风格”API,一个使用“旧风格”API。
顺序是:
- 创建订阅
- 无法提取任何消息(因为没有可用的消息)
- 发布消息
- 拉该消息,但不要确认它
- 最后再拉一次,这需要 10 秒,因为消息 ACK 超时必须先过期
https://gist.github.com/ianrose14/db6ecd9ccb6c84c8b36bf49d93b11bfb
使用旧式 API 的测试正如我所期望的那样工作:
=== RUN TestPubSubRereadLegacyForDemo
--- PASS: TestPubSubRereadLegacyForDemo (10.32s)
pubsubintg_test.go:217: PullWait returned in 21.64236ms (expected 0)
pubsubintg_test.go:228: PullWait returned in 10.048119558s (expected 10s)
PASS
而使用新型 API 的测试工作不可靠。有时事情会按预期工作:
=== RUN TestPubSubRereadForDemo
--- PASS: TestPubSubRereadForDemo (11.38s)
pubsubintg_test.go:149: iter.Next() returned in 17.686701ms (expected 0)
pubsubintg_test.go:171: iter.Next() returned in 10.059492646s (expected 10s)
PASS
但有时我发现它iter.Stop()
并没有像它应该的那样迅速返回(并注意第二个 iter.Next 比它应该长得多):
=== RUN TestPubSubRereadForDemo
--- FAIL: TestPubSubRereadForDemo (23.87s)
pubsubintg_test.go:149: iter.Next() returned in 7.3284ms (expected 0)
pubsubintg_test.go:171: iter.Next() returned in 20.074994835s (expected 10s)
pubsubintg_test.go:183: iter.Stop() took too long (2.475055901s)
FAIL
而其他时候我发现发布消息后的第一次拉取时间太长(它应该接近即时):
=== RUN TestPubSubRereadForDemo
--- FAIL: TestPubSubRereadForDemo (6.32s)
pubsubintg_test.go:147: failed to pull message from iterator: context deadline exceeded
FAIL
有任何想法吗?是否有任何使用新型 API 的工作示例?不幸的是,这里的 Go 入门项目使用了旧的、已弃用的 API。