@@ -59,7 +59,7 @@ use torii_proto::Message;
59
59
60
60
use anyhow:: { anyhow, Error } ;
61
61
62
- #[ derive( Debug , Clone ) ]
62
+ #[ derive( Debug ) ]
63
63
pub struct DojoWorld < P : Provider + Sync > {
64
64
storage : Arc < dyn Storage > ,
65
65
provider : Arc < P > ,
@@ -73,6 +73,8 @@ pub struct DojoWorld<P: Provider + Sync> {
73
73
token_manager : Arc < TokenManager > ,
74
74
transaction_manager : Arc < TransactionManager > ,
75
75
_config : GrpcConfig ,
76
+ // Keep runtime alive
77
+ _subscriptions_runtime : tokio:: runtime:: Runtime ,
76
78
}
77
79
78
80
impl < P : Provider + Sync > DojoWorld < P > {
@@ -91,31 +93,40 @@ impl<P: Provider + Sync> DojoWorld<P> {
91
93
let token_manager = Arc :: new ( TokenManager :: new ( config. clone ( ) ) ) ;
92
94
let transaction_manager = Arc :: new ( TransactionManager :: new ( config. clone ( ) ) ) ;
93
95
94
- tokio:: task:: spawn ( subscriptions:: entity:: Service :: new ( Arc :: clone (
96
+ // Create a separate runtime for subscription processing
97
+ // This isolates subscription work from gRPC request handling
98
+ let subscriptions_runtime = tokio:: runtime:: Builder :: new_multi_thread ( )
99
+ . worker_threads ( num_cpus:: get ( ) . min ( 4 ) ) // Dedicated threads for subscriptions
100
+ . thread_name ( "torii-grpc-subscriptions" )
101
+ . build ( )
102
+ . expect ( "Failed to create subscriptions runtime" ) ;
103
+
104
+ // Spawn subscription services on the dedicated runtime
105
+ subscriptions_runtime. spawn ( subscriptions:: entity:: Service :: new ( Arc :: clone (
95
106
& entity_manager,
96
107
) ) ) ;
97
108
98
- tokio :: task :: spawn ( subscriptions:: event_message:: Service :: new ( Arc :: clone (
109
+ subscriptions_runtime . spawn ( subscriptions:: event_message:: Service :: new ( Arc :: clone (
99
110
& event_message_manager,
100
111
) ) ) ;
101
112
102
- tokio :: task :: spawn ( subscriptions:: event:: Service :: new ( Arc :: clone (
113
+ subscriptions_runtime . spawn ( subscriptions:: event:: Service :: new ( Arc :: clone (
103
114
& event_manager,
104
115
) ) ) ;
105
116
106
- tokio :: task :: spawn ( subscriptions:: indexer:: Service :: new ( Arc :: clone (
117
+ subscriptions_runtime . spawn ( subscriptions:: indexer:: Service :: new ( Arc :: clone (
107
118
& indexer_manager,
108
119
) ) ) ;
109
120
110
- tokio :: task :: spawn ( subscriptions:: token_balance:: Service :: new ( Arc :: clone (
121
+ subscriptions_runtime . spawn ( subscriptions:: token_balance:: Service :: new ( Arc :: clone (
111
122
& token_balance_manager,
112
123
) ) ) ;
113
124
114
- tokio :: task :: spawn ( subscriptions:: token:: Service :: new ( Arc :: clone (
125
+ subscriptions_runtime . spawn ( subscriptions:: token:: Service :: new ( Arc :: clone (
115
126
& token_manager,
116
127
) ) ) ;
117
128
118
- tokio :: task :: spawn ( subscriptions:: transaction:: Service :: new ( Arc :: clone (
129
+ subscriptions_runtime . spawn ( subscriptions:: transaction:: Service :: new ( Arc :: clone (
119
130
& transaction_manager,
120
131
) ) ) ;
121
132
@@ -132,6 +143,7 @@ impl<P: Provider + Sync> DojoWorld<P> {
132
143
token_manager,
133
144
transaction_manager,
134
145
_config : config,
146
+ _subscriptions_runtime : subscriptions_runtime,
135
147
}
136
148
}
137
149
}
0 commit comments