Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
丁松杰
/
Pole
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
5f7a7238
authored
Feb 09, 2020
by
丁松杰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化代码
parent
b2ed39db
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
36 additions
and
85 deletions
src/Pole.Core/EventBus/IObserverUnit.cs
src/Pole.Core/EventBus/ObserverUnit.cs
src/Pole.EventBus.Rabbitmq/Configuration/RabbitOptions.cs
src/Pole.EventBus.Rabbitmq/Consumer/ConsumerManager.cs
src/Pole.EventBus.Rabbitmq/Consumer/ConsumerRunner.cs
src/Pole.EventBus.Rabbitmq/Consumer/RabbitConsumer.cs
src/Pole.EventBus.Rabbitmq/Core/RabbitEventBus.cs
src/Pole.EventBus.Rabbitmq/Pole.EventBus.Rabbitmq.csproj
src/Pole.Core/EventBus/IObserverUnit.cs
View file @
5f7a7238
...
@@ -6,7 +6,7 @@ namespace Pole.Core.EventBus
...
@@ -6,7 +6,7 @@ namespace Pole.Core.EventBus
{
{
public
interface
IObserverUnit
<
PrimaryKey
>
:
IGrainID
public
interface
IObserverUnit
<
PrimaryKey
>
:
IGrainID
{
{
List
<
Func
<
byte
[],
Task
>>
GetEventHandlers
();
Func
<
byte
[],
Task
>
GetEventHandler
();
List
<
Func
<
List
<
byte
[
]>
,
Task
>>
GetBatchEventHandlers
();
Func
<
List
<
byte
[
]>
,
Task
>
GetBatchEventHandler
();
}
}
}
}
src/Pole.Core/EventBus/ObserverUnit.cs
View file @
5f7a7238
...
@@ -22,8 +22,8 @@ namespace Pole.Core.EventBus
...
@@ -22,8 +22,8 @@ namespace Pole.Core.EventBus
readonly
ISerializer
serializer
;
readonly
ISerializer
serializer
;
readonly
ITypeFinder
typeFinder
;
readonly
ITypeFinder
typeFinder
;
readonly
IClusterClient
clusterClient
;
readonly
IClusterClient
clusterClient
;
readonly
List
<
Func
<
byte
[],
Task
>>
eventHandlers
=
new
List
<
Func
<
byte
[],
Task
>>()
;
Func
<
byte
[],
Task
>
eventHandler
;
readonly
List
<
Func
<
List
<
byte
[
]>
,
Task
>>
batchEventHandlers
=
new
List
<
Func
<
List
<
byte
[
]>
,
Task
>>()
;
Func
<
List
<
byte
[
]>
,
Task
>
batchEventHandler
;
protected
ILogger
Logger
{
get
;
private
set
;
}
protected
ILogger
Logger
{
get
;
private
set
;
}
public
Type
GrainType
{
get
;
}
public
Type
GrainType
{
get
;
}
...
@@ -41,21 +41,21 @@ namespace Pole.Core.EventBus
...
@@ -41,21 +41,21 @@ namespace Pole.Core.EventBus
return
new
ObserverUnit
<
PrimaryKey
>(
serviceProvider
,
typeof
(
Grain
));
return
new
ObserverUnit
<
PrimaryKey
>(
serviceProvider
,
typeof
(
Grain
));
}
}
public
List
<
Func
<
byte
[],
Task
>>
GetEventHandlers
()
public
Func
<
byte
[],
Task
>
GetEventHandler
()
{
{
return
eventHandler
s
;
return
eventHandler
;
}
}
public
List
<
Func
<
List
<
byte
[
]>
,
Task
>>
GetBatchEventHandlers
()
public
Func
<
List
<
byte
[
]>
,
Task
>
GetBatchEventHandler
()
{
{
return
batchEventHandler
s
;
return
batchEventHandler
;
}
}
public
ObserverUnit
<
PrimaryKey
>
UnreliableObserver
(
public
ObserverUnit
<
PrimaryKey
>
UnreliableObserver
(
Func
<
IServiceProvider
,
Func
<
IServiceProvider
,
FullyEvent
<
PrimaryKey
>,
ValueTask
>
handler
)
FullyEvent
<
PrimaryKey
>,
ValueTask
>
handler
)
{
{
GetEventHandlers
().
Add
(
EventHandler
)
;
eventHandler
=
EventHandler
;
GetBatchEventHandlers
().
Add
(
BatchEventHandler
)
;
batchEventHandler
=
BatchEventHandler
;
return
this
;
return
this
;
//内部函数
//内部函数
Task
EventHandler
(
byte
[]
bytes
)
Task
EventHandler
(
byte
[]
bytes
)
...
@@ -111,8 +111,8 @@ namespace Pole.Core.EventBus
...
@@ -111,8 +111,8 @@ namespace Pole.Core.EventBus
{
{
if
(!
typeof
(
PoleEventHandlerBase
).
IsAssignableFrom
(
observerType
))
if
(!
typeof
(
PoleEventHandlerBase
).
IsAssignableFrom
(
observerType
))
throw
new
NotSupportedException
(
$"
{
observerType
.
FullName
}
must inheritance from PoleEventHandler"
);
throw
new
NotSupportedException
(
$"
{
observerType
.
FullName
}
must inheritance from PoleEventHandler"
);
GetEventHandlers
().
Add
(
EventHandler
)
;
eventHandler
=
EventHandler
;
GetBatchEventHandlers
().
Add
(
BatchEventHandler
)
;
batchEventHandler
=
BatchEventHandler
;
//内部函数
//内部函数
Task
EventHandler
(
byte
[]
bytes
)
Task
EventHandler
(
byte
[]
bytes
)
{
{
...
...
src/Pole.EventBus.Rabbitmq/Configuration/RabbitOptions.cs
View file @
5f7a7238
...
@@ -9,7 +9,10 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -9,7 +9,10 @@ namespace Pole.EventBus.RabbitMQ
public
string
Password
{
get
;
set
;
}
public
string
Password
{
get
;
set
;
}
public
string
VirtualHost
{
get
;
set
;
}
public
string
VirtualHost
{
get
;
set
;
}
public
int
MasChannelsPerConnection
{
get
;
set
;
}
=
200
;
public
int
MasChannelsPerConnection
{
get
;
set
;
}
=
200
;
public
int
MaxConnection
{
get
;
set
;
}
=
20
;
/// <summary>
/// 目前为一个连接 当消息数量非常大时,单个TCP连接的运输能力有限,可以修改这个最大连接数提高运输能力
/// </summary>
public
int
MaxConnection
{
get
;
set
;
}
=
1
;
/// <summary>
/// <summary>
/// 消费者批量处理每次处理的最大消息量
/// 消费者批量处理每次处理的最大消息量
/// </summary>
/// </summary>
...
...
src/Pole.EventBus.Rabbitmq/Consumer/ConsumerManager.cs
View file @
5f7a7238
...
@@ -43,49 +43,21 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -43,49 +43,21 @@ namespace Pole.EventBus.RabbitMQ
int
distributedMonitorTimeLock
=
0
;
int
distributedMonitorTimeLock
=
0
;
int
distributedHoldTimerLock
=
0
;
int
distributedHoldTimerLock
=
0
;
int
heathCheckTimerLock
=
0
;
int
heathCheckTimerLock
=
0
;
private
async
Task
Distributed
Start
()
private
async
Task
Start
()
{
{
try
var
consumers
=
rabbitEventBusContainer
.
GetConsumers
();
foreach
(
var
consumer
in
consumers
)
{
{
if
(
Interlocked
.
CompareExchange
(
ref
distributedMonitorTimeLock
,
1
,
0
)
==
0
)
if
(
consumer
is
RabbitConsumer
value
)
{
{
var
consumers
=
rabbitEventBusContainer
.
GetConsumers
();
var
queue
=
value
.
QueueInfo
;
foreach
(
var
consumer
in
consumers
)
var
key
=
queue
.
Queue
;
{
if
(
consumer
is
RabbitConsumer
value
)
{
for
(
int
i
=
0
;
i
<
value
.
QueueList
.
Count
();
i
++)
{
var
queue
=
value
.
QueueList
[
i
];
var
key
=
queue
.
ToString
();
if
(!
Runners
.
ContainsKey
(
key
))
{
var
weight
=
100000
-
Runners
.
Count
;
var
(
isOk
,
lockId
,
expectMillisecondDelay
)
=
await
grainFactory
.
GetGrain
<
IWeightHoldLock
>(
key
).
Lock
(
weight
,
lockHoldingSeconds
);
if
(
isOk
)
{
if
(
Runners
.
TryAdd
(
key
,
lockId
))
{
var
runner
=
new
ConsumerRunner
(
client
,
provider
,
value
,
queue
);
ConsumerRunners
.
TryAdd
(
key
,
runner
);
await
runner
.
Run
();
}
}
var
runner
=
new
ConsumerRunner
(
client
,
provider
,
value
,
queue
);
}
ConsumerRunners
.
TryAdd
(
key
,
runner
);
}
await
runner
.
Run
();
}
}
Interlocked
.
Exchange
(
ref
distributedMonitorTimeLock
,
0
);
if
(
logger
.
IsEnabled
(
LogLevel
.
Information
))
logger
.
LogInformation
(
"EventBus Background Service is working."
);
}
}
}
}
catch
(
Exception
exception
)
{
logger
.
LogError
(
exception
.
InnerException
??
exception
,
nameof
(
DistributedStart
));
Interlocked
.
Exchange
(
ref
distributedMonitorTimeLock
,
0
);
}
}
}
private
async
Task
DistributedHold
()
private
async
Task
DistributedHold
()
{
{
...
@@ -141,7 +113,7 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -141,7 +113,7 @@ namespace Pole.EventBus.RabbitMQ
{
{
if
(
logger
.
IsEnabled
(
LogLevel
.
Information
))
if
(
logger
.
IsEnabled
(
LogLevel
.
Information
))
logger
.
LogInformation
(
"EventBus Background Service is starting."
);
logger
.
LogInformation
(
"EventBus Background Service is starting."
);
DistributedMonitorTime
=
new
Timer
(
state
=>
Distributed
Start
().
Wait
(),
null
,
1000
,
_MonitTime
);
DistributedMonitorTime
=
new
Timer
(
state
=>
Start
().
Wait
(),
null
,
1000
,
_MonitTime
);
DistributedHoldTimer
=
new
Timer
(
state
=>
DistributedHold
().
Wait
(),
null
,
_HoldTime
,
_HoldTime
);
DistributedHoldTimer
=
new
Timer
(
state
=>
DistributedHold
().
Wait
(),
null
,
_HoldTime
,
_HoldTime
);
HeathCheckTimer
=
new
Timer
(
state
=>
{
HeathCheck
().
Wait
();
},
null
,
_checkTime
,
_checkTime
);
HeathCheckTimer
=
new
Timer
(
state
=>
{
HeathCheck
().
Wait
();
},
null
,
_checkTime
,
_checkTime
);
return
Task
.
CompletedTask
;
return
Task
.
CompletedTask
;
...
...
src/Pole.EventBus.Rabbitmq/Consumer/ConsumerRunner.cs
View file @
5f7a7238
...
@@ -42,8 +42,10 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -42,8 +42,10 @@ namespace Pole.EventBus.RabbitMQ
{
{
isFirst
=
false
;
isFirst
=
false
;
Model
.
Model
.
ExchangeDeclare
(
Consumer
.
EventBus
.
Exchange
,
"direct"
,
true
);
Model
.
Model
.
ExchangeDeclare
(
Consumer
.
EventBus
.
Exchange
,
"direct"
,
true
);
Model
.
Model
.
ExchangeDeclare
(
Queue
.
Queue
,
"direct"
,
true
);
Model
.
Model
.
ExchangeBind
(
Consumer
.
EventBus
.
Exchange
,
Queue
.
Queue
,
string
.
Empty
);
Model
.
Model
.
QueueDeclare
(
Queue
.
Queue
,
true
,
false
,
false
,
null
);
Model
.
Model
.
QueueDeclare
(
Queue
.
Queue
,
true
,
false
,
false
,
null
);
Model
.
Model
.
QueueBind
(
Queue
.
Queue
,
Consumer
.
EventBus
.
Exchange
,
Queue
.
RoutingKe
y
);
Model
.
Model
.
QueueBind
(
Queue
.
Queue
,
Queue
.
Queue
,
string
.
Empt
y
);
}
}
Model
.
Model
.
BasicQos
(
0
,
Model
.
Connection
.
Options
.
CunsumerMaxBatchSize
,
false
);
Model
.
Model
.
BasicQos
(
0
,
Model
.
Connection
.
Options
.
CunsumerMaxBatchSize
,
false
);
BasicConsumer
=
new
EventingBasicConsumer
(
Model
.
Model
);
BasicConsumer
=
new
EventingBasicConsumer
(
Model
.
Model
);
...
...
src/Pole.EventBus.Rabbitmq/Consumer/RabbitConsumer.cs
View file @
5f7a7238
...
@@ -8,12 +8,12 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -8,12 +8,12 @@ namespace Pole.EventBus.RabbitMQ
public
class
RabbitConsumer
:
Consumer
public
class
RabbitConsumer
:
Consumer
{
{
public
RabbitConsumer
(
public
RabbitConsumer
(
List
<
Func
<
byte
[],
Task
>
>
eventHandlers
,
Func
<
byte
[],
Task
>
eventHandlers
,
List
<
Func
<
List
<
byte
[
]>
,
Task
>>
batchEventHandlers
)
:
base
(
eventHandlers
,
batchEventHandlers
)
Func
<
List
<
byte
[
]>
,
Task
>
batchEventHandlers
)
:
base
(
new
List
<
Func
<
byte
[],
Task
>>
{
eventHandlers
},
new
List
<
Func
<
List
<
byte
[
]>
,
Task
>>
{
batchEventHandlers
}
)
{
{
}
}
public
RabbitEventBus
EventBus
{
get
;
set
;
}
public
RabbitEventBus
EventBus
{
get
;
set
;
}
public
List
<
QueueInfo
>
QueueList
{
get
;
set
;
}
public
QueueInfo
QueueInfo
{
get
;
set
;
}
public
ConsumerOptions
Config
{
get
;
set
;
}
public
ConsumerOptions
Config
{
get
;
set
;
}
}
}
}
}
src/Pole.EventBus.Rabbitmq/Core/RabbitEventBus.cs
View file @
5f7a7238
...
@@ -10,7 +10,6 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -10,7 +10,6 @@ namespace Pole.EventBus.RabbitMQ
{
{
public
class
RabbitEventBus
public
class
RabbitEventBus
{
{
private
readonly
ConsistentHash
_CHash
;
readonly
IObserverUnitContainer
observerUnitContainer
;
readonly
IObserverUnitContainer
observerUnitContainer
;
public
RabbitEventBus
(
public
RabbitEventBus
(
IObserverUnitContainer
observerUnitContainer
,
IObserverUnitContainer
observerUnitContainer
,
...
@@ -34,8 +33,6 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -34,8 +33,6 @@ namespace Pole.EventBus.RabbitMQ
AutoAck
=
autoAck
,
AutoAck
=
autoAck
,
Reenqueue
=
reenqueue
,
Reenqueue
=
reenqueue
,
};
};
RouteList
=
new
List
<
string
>()
{
$"
{
routePrefix
}
"
};
_CHash
=
new
ConsistentHash
(
RouteList
,
lBCount
*
10
);
}
}
public
IRabbitEventBusContainer
Container
{
get
;
}
public
IRabbitEventBusContainer
Container
{
get
;
}
public
string
Exchange
{
get
;
}
public
string
Exchange
{
get
;
}
...
@@ -52,7 +49,7 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -52,7 +49,7 @@ namespace Pole.EventBus.RabbitMQ
public
List
<
RabbitConsumer
>
Consumers
{
get
;
set
;
}
=
new
List
<
RabbitConsumer
>();
public
List
<
RabbitConsumer
>
Consumers
{
get
;
set
;
}
=
new
List
<
RabbitConsumer
>();
public
string
GetRoute
(
string
key
)
public
string
GetRoute
(
string
key
)
{
{
return
LBCount
==
1
?
RoutePrefix
:
_CHash
.
GetNode
(
key
);
;
return
RoutePrefix
;
}
}
public
RabbitEventBus
BindEvent
(
Type
eventType
,
string
eventName
)
public
RabbitEventBus
BindEvent
(
Type
eventType
,
string
eventName
)
{
{
...
@@ -66,33 +63,17 @@ namespace Pole.EventBus.RabbitMQ
...
@@ -66,33 +63,17 @@ namespace Pole.EventBus.RabbitMQ
foreach
(
var
observerUnit
in
observerUnits
)
foreach
(
var
observerUnit
in
observerUnits
)
{
{
var
consumer
=
new
RabbitConsumer
(
var
consumer
=
new
RabbitConsumer
(
observerUnit
.
GetEventHandler
s
(),
observerUnit
.
GetEventHandler
(),
observerUnit
.
GetBatchEventHandler
s
())
observerUnit
.
GetBatchEventHandler
())
{
{
EventBus
=
this
,
EventBus
=
this
,
Queue
List
=
RouteList
.
Select
(
route
=>
new
QueueInfo
{
RoutingKey
=
""
,
Queue
=
$"
{
route
}
_
{
EventName
}
"
}).
ToList
()
,
Queue
Info
=
new
QueueInfo
{
RoutingKey
=
RoutePrefix
,
Queue
=
$"
{
RoutePrefix
}
_
{
observerUnit
}
"
}
,
Config
=
ConsumerConfig
Config
=
ConsumerConfig
};
};
Consumers
.
Add
(
consumer
);
Consumers
.
Add
(
consumer
);
}
}
return
Enable
();
return
Enable
();
}
}
public
RabbitEventBus
AddConsumer
(
Func
<
byte
[],
Task
>
handler
,
Func
<
List
<
byte
[
]>
,
Task
>
batchHandler
,
string
observerGroup
)
{
var
consumer
=
new
RabbitConsumer
(
new
List
<
Func
<
byte
[],
Task
>>
{
handler
},
new
List
<
Func
<
List
<
byte
[
]>
,
Task
>>
{
batchHandler
})
{
EventBus
=
this
,
QueueList
=
RouteList
.
Select
(
route
=>
new
QueueInfo
{
RoutingKey
=
route
,
Queue
=
$"
{
route
}
_
{
observerGroup
}
"
}).
ToList
(),
Config
=
ConsumerConfig
};
Consumers
.
Add
(
consumer
);
return
this
;
}
public
Task
Enable
()
public
Task
Enable
()
{
{
return
Container
.
Work
(
this
);
return
Container
.
Work
(
this
);
...
...
src/Pole.EventBus.Rabbitmq/Pole.EventBus.Rabbitmq.csproj
View file @
5f7a7238
...
@@ -17,11 +17,4 @@
...
@@ -17,11 +17,4 @@
<ProjectReference Include="..\Pole.Core\Pole.Core.csproj" />
<ProjectReference Include="..\Pole.Core\Pole.Core.csproj" />
</ItemGroup>
</ItemGroup>
<ItemGroup>
<Folder Include="Core\Attributes\" />
<Folder Include="Core\Client\" />
<Folder Include="Core\Configuration\" />
<Folder Include="Core\Consumer\" />
</ItemGroup>
</Project>
</Project>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment