Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
  • Jun 21 17:45
    Arkatufus synchronize #5080
  • Jun 21 17:45

    Arkatufus on nuget

    Added v1.4.22 placeholder for n… Use ranged nuget versioning for… Merge branch 'dev' into dependa… (compare)

  • Jun 21 12:16
    Aaronontheweb synchronize #5098
  • Jun 19 17:31

    Aaronontheweb on dev

    Use ranged nuget versioning for… (compare)

  • Jun 19 17:31
    Aaronontheweb closed #5099
  • Jun 18 23:09
    Arkatufus synchronize #5100
  • Jun 18 22:54
    Arkatufus synchronize #5100
  • Jun 18 22:42
    Arkatufus synchronize #5100
  • Jun 18 22:18
    Arkatufus synchronize #5100
  • Jun 18 22:05
    Arkatufus synchronize #5100
  • Jun 18 22:00
    Arkatufus synchronize #5100
  • Jun 18 21:49
    Arkatufus synchronize #5100
  • Jun 18 21:28
    Arkatufus labeled #5100
  • Jun 18 21:28
    Arkatufus opened #5100
  • Jun 18 17:03
    Aaronontheweb auto_merge_enabled #5099
  • Jun 18 11:03
    Aaronontheweb synchronize #4861
  • Jun 18 09:52
    pirovorster commented #4823
  • Jun 18 09:27
    IgorFedchenko commented #4823
  • Jun 18 09:19
    pirovorster commented #4823
  • Jun 17 22:05
    Aaronontheweb synchronize #5098
Victor
@vicosoft4real
sounds good
Aaron Stannard
@Aaronontheweb
so in the event that the entity passivates (shuts down after a period of inactivity) and needs to be recreated in the future
Victor
@vicosoft4real
but we cannot have full control of the created entity/actor
Aaron Stannard
@Aaronontheweb
or in the event that the entity gets moved
it can recover its previous state
you can define the Props that get used to spawn ALL entity actors
Victor
@vicosoft4real
ok
Aaron Stannard
@Aaronontheweb
but no, you don't have any control over how that actor is created
it's created lazily
when someone sends a message to the ShardRegion or ShardRegionProxy
and the sharding system uses a MessageExtractor to pull the entityId from the message
if an entity doesn't exist with that entityId yetr
it will be created
essentially it's doing the same thing the child-per-entity pattern does
Victor
@vicosoft4real
ok
Victor
@vicosoft4real
to actually have full control over an actor , like managing the state, persisting message to external DB, Cluster sharding may not be best approach.
Aaron Stannard
@Aaronontheweb
you can still use cluster.sharding for that
the actor can control its own life cycle
its just that the actor can be moved if a new node joins the cluster that can host shards
so it should be designed to behave like a persistent actor
where it has an explicit state recovery mechanism and processing stage it executes before it's allowed to process any new messages
Victor
@vicosoft4real
hmm
Aaron Stannard
@Aaronontheweb
you can pass in a Props class created using DI too
since the actors don't get deployed remotely
Victor
@vicosoft4real
please go along with me.
i have a shardenvilope :

public sealed class ShardEnvelope
{
public readonly string Recipient;
public readonly object Message;

    public ShardEnvelope(string recipient, object message)
    {
        Recipient = recipient;
        Message = message;
    }
}

}

an extrator : public class CustomMessageExtractor : HashCodeMessageExtractor
{
public CustomMessageExtractor(int maxNumberOfShards) : base(maxNumberOfShards) { }
public override string EntityId(object message) => (message as ShardEnvelope)?.Recipient;
public override object EntityMessage(object message) => (message as ShardEnvelope)?.Message ?? message;
// public string ShardId(object message)
// {
// return (message as ShardEnvelope)?.ShardId.ToString();
// }
}
message A :smile: public class Message1
{
public Message1(string name1)
{
Name1 = name1;
}
    public string Name1 { get; }
}
Actor A public class ActorA: AtLeastOnceDeliveryReceiveActor
{
    public override string PersistenceId { get; }
    readonly ILoggingAdapter _logger = Context.GetLogger();

    public ActorA()
    {
        PersistenceId = Uri.UnescapeDataString(Self.Path.Name);
        _logger.Info($"Instantiating {nameof(ActorA)} in the constructor with path {Self.Path}");
        Command<Message1>(msg =>
        {
            _logger.Info($"log message {msg.Name1}");
            IActorRef shardRegion2 = Context.System.BootstrapShard<ActorB>("web-node1");
            // Context.ActorOf(Props.Create<ActorB>());

        });
        //Command<Message2>(msg =>
        //{
        //    _logger.Info($"log message {msg.Name1}");

        //});
    }
}
public class ActorB : ReceivePersistentActor
{
    public override string PersistenceId { get; }
    readonly ILoggingAdapter _logger = Context.GetLogger();

    public ActorB()
    {
        PersistenceId = Uri.UnescapeDataString(Self.Path.Name);

        _logger.Info($"Instantiating {nameof(ActorB)} in the constructor with path {Self.Path.Name}");
        Command<Message2>(msg =>
        {
            _logger.Info($"log message {msg.Name1}");

        });

    }
}
at start up I configure my shardding as :smile: ClusterSharding sharding = ClusterSharding.Get(eduSaaSSystem);
IActorRef shardRegion = sharding.Start(
typeName: typeof(ActorA).Name,
entityProps: Props.Create<ActorA>(), // the Props used to create entities
settings: ClusterShardingSettings.Create(eduSaaSSystem)
.WithCoordinatorSingletonSettings(ClusterSingletonManagerSettings.Create(eduSaaSSystem))
.WithRole("web-node")
,
messageExtractor: new CustomMessageExtractor(100 * 10)
);
if i send message to shard region as shardRegion .Tell(new ShardEnvelope(id, messagea));
Victor
@vicosoft4real
@Aaronontheweb is it possible to send message to actorB with message2
@Aaronontheweb are u with me?
Aaron Stannard
@Aaronontheweb
I think so.... the message extractor is looking for a property called Recipient on the message
ah I see
you're using an envelope for that
but yeah, that message will be received by your persistent actor
Victor
@vicosoft4real
ok
Mitchell Tannenbaum
@naturallymitchell
How does Akka.net differ from Akka? (eg. architecturally, if it does)
Vagif Abilov
@object
@mitchtbaum Akka.NET is a port of Akka so it has the same architectural principles. The difference is in ecosystem, use of external libraries etc.
Mitchell Tannenbaum
@naturallymitchell
@object Thank you.
Vagif Abilov
@object
@mitchtbaum moreover, the port is rather accurate in use of terms, naming, configuration so it's possible to discuss Akka-related topics with developers of both communities.
Jalal EL-SHAER
@jalchr
@Aaronontheweb thanks for detailed explanation and the valuable video.
I understand the complexity of the problem. I'll try to port this sample to akka.net and see how things go: http://proto.actor/blog/2017/06/24/money-transfer-saga.html
Jose Carlos Marquez
@oeaoaueaa
hi, is anyone available to review the pull request AkkaNetContrib/Akka.DI.Ninject#10 ?
jameswilddev
@jameswilddev
Hello! Does TestScheduler have any mechanism for emulating a failure to deliver the message sent by ScheduleTellOnceCancelable/etc?
Arjen Smits
@Danthar
@jameswilddev no, if you want to be sure its delivered (it will be send to the IActorRef you tell it to, but that actor might not receive it because its remote), you will have to use mechanisms like AtLeastOnceDelivery. So instead of directly sending it to the remote actor (assuming here) you put an atleastoncedelivery actor in between or something.
Or whatever other reliable delivery mechanism you want to use
So what im saying is: emulating a failure to deliver by the Scheduler, is the wrong place to be handling this.