Skip to content

Commit 465c3db

Browse files
authored
Improve message bus topic matching performance (#2151)
1 parent 3ac3a39 commit 465c3db

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

nautilus_core/common/src/msgbus/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,14 @@ mod tests {
638638
#[case("data.quotes.BINANCE", "data.*.BINANCE", true)]
639639
#[case("data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.*", true)]
640640
#[case("data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ETH*", true)]
641+
#[case("data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ETH???", false)]
642+
#[case("data.trades.BINANCE.ETHUSD", "data.*.BINANCE.ETH???", true)]
643+
// We don't support [seq] style pattern
644+
#[case("data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ET[HC]USDT", false)]
645+
// We don't support [!seq] style pattern
646+
#[case("data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ET[!ABC]USDT", false)]
647+
// We don't support [^seq] style pattern
648+
#[case("data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ET[^ABC]USDT", false)]
641649
fn test_is_matching(#[case] topic: &str, #[case] pattern: &str, #[case] expected: bool) {
642650
assert_eq!(
643651
is_matching(&Ustr::from(topic), &Ustr::from(pattern)),

nautilus_trader/common/component.pyx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2596,7 +2596,17 @@ cdef class MessageBus:
25962596
return subs_array
25972597

25982598

2599+
cdef inline bint contains_wildcard(str topic_or_pattern):
2600+
return '?' in topic_or_pattern or '*' in topic_or_pattern
2601+
2602+
25992603
cdef inline bint is_matching(str topic, str pattern):
2604+
topic_contains_wildcard = contains_wildcard(topic)
2605+
pattern_contains_wildcard = contains_wildcard(pattern)
2606+
2607+
if not topic_contains_wildcard and not pattern_contains_wildcard:
2608+
return topic == pattern
2609+
26002610
# Get length of string and wildcard pattern
26012611
cdef int n = len(topic)
26022612
cdef int m = len(pattern)

tests/unit_tests/msgbus/test_bus.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,14 @@ def test_msgbus_for_system_events_using_component_id(self):
469469
["data.quotes.BINANCE", "data.*.BINANCE", True],
470470
["data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.*", True],
471471
["data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ETH*", True],
472+
["data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ETH???", False],
473+
["data.trades.BINANCE.ETHUSD", "data.*.BINANCE.ETH???", True],
474+
# We don't support [seq] style pattern
475+
["data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ET[HC]USDT", False],
476+
# We don't support [!seq] style pattern
477+
["data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ET[!ABC]USDT", False],
478+
# We don't support [^seq] style pattern
479+
["data.trades.BINANCE.ETHUSDT", "data.*.BINANCE.ET[^ABC]USDT", False],
472480
],
473481
)
474482
def test_is_matching_given_various_topic_pattern_combos(topic, pattern, expected):

0 commit comments

Comments
 (0)