Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Oct 26 17:02

    jeremydmiller on master

    Using the RabbitMqEnvelope and … (compare)

  • Oct 26 16:51

    jeremydmiller on optimization

    Using the RabbitMqEnvelope and … (compare)

  • Oct 26 15:25

    jeremydmiller on optimization

    using the invoke and enqueue me… Folded InMemoryEnvelopeTransact… Using object pooling for execut… and 1 more (compare)

  • Oct 26 15:25

    jeremydmiller on master

    Folded InMemoryEnvelopeTransact… Using object pooling for execut… optimized sequential guid code (compare)

  • Oct 26 12:50

    jeremydmiller on master

    using the invoke and enqueue me… (compare)

  • Oct 25 22:19

    jeremydmiller on master

    benchmarks for loading persiste… inlined the SQL temporarily fixing a unit test failing on D… and 28 more (compare)

  • Oct 25 22:19

    jeremydmiller on optimization

    inlined more sql in the message… Performance benchmark support f… benchmarks for invoking message… and 1 more (compare)

  • Oct 25 17:39
    jeremydmiller opened #677
  • Oct 25 15:09

    jeremydmiller on optimization

    benchmarks for loading persiste… inlined the SQL temporarily fixing a unit test failing on D… and 24 more (compare)

  • Oct 25 15:03

    jeremydmiller on master

    new bullseye build new benchmark target new driver model for benchmarks… (compare)

  • Oct 25 13:17
    jeremydmiller closed #674
  • Oct 25 13:16
    jeremydmiller commented #674
  • Oct 24 22:56

    jeremydmiller on optimization

    Separated out CommandBus from M… Pulled MessagePublisher out of … renamed MessageContext to Execu… and 2 more (compare)

  • Oct 22 21:34
    jeremydmiller opened #676
  • Oct 22 20:16

    jeremydmiller on optimization

    benchmarks for loading persiste… inlined the SQL temporarily fixing a unit test failing on D… and 20 more (compare)

  • Oct 20 14:24

    jeremydmiller on master

    removed Envelope.SentAttempts t… little cleanup on Envelope Using the DAtabaseConstants thr… and 11 more (compare)

  • Oct 20 13:41

    jeremydmiller on optimization

    removed Envelope.SentAttempts t… little cleanup on Envelope Using the DAtabaseConstants thr… and 20 more (compare)

  • Oct 17 15:01
    jeremydmiller edited #555
  • Oct 17 15:01
    jeremydmiller edited #555
  • Oct 17 15:01
    jeremydmiller commented #555
Jeremy D. Miller
@jeremydmiller
Pretty well the same thing. If it’s durable, Jasper is persisting the message until it’s successfully processed, then deleting it. It’s trying to achieve guaranteed delivery locally
Anthony Acquah
@anthony.acquah_gitlab
Got it
Anthony Acquah
@tonymobster
Jeremy D. Miller
@jeremydmiller
Yup.
I think that’ll make a big difference for things like validation. Already seen somebody doing an INotifyPropertyChanged implementation with it
Anthony Acquah
@tonymobster
:+1:
the design and rationale behind it is a bit like jasper middleware/lamar codegeneration
Jeremy D. Miller
@jeremydmiller
Definitely. I’ve know the source generator thing was coming. So far though, I don’t know that it’s going to apply to Jasper. Maybe to short circuit type discovery
Jasper / Lamar actually does have a model to pre-generate the code ahead of time, then discover the handler classes from the assembly at runtime
Mark Warpool
@CodingGorilla
@jeremydmiller If you get a chance, could you take a look at #655 , I keep bumping into this issue.
Jeremy D. Miller
@jeremydmiller
@CodingGorilla v1.1.4 will have that PR as soon as Nuget catches up. Sorry for the delay
Mark Warpool
@CodingGorilla
No problem, thanks for the quick turn around!
Anthony Acquah
@tonymobster

@jeremydmiller I think i found a few issues with the ef core/postgres storage support

  1. The creation sql script uses VARCHAR(250) columns which causes inserts to fail in the dead letter table when messages exceed the 250 chars limit. This causes lots of retries every few seconds(probably stops after some max retry limit. Also the exception details has "IsTransient": false is there a way to check that to decide if it should be retried?) which constantly fail.

  2. The creation script is run on app startup(I'm not sure under which conditions) and it seems to do some sort of schema compare so even though my initial ef core migration uses text columns and even when I manually modify it in the database they get dropped and recreated when the app restarts.

  3. The ef core MapEnvelopeStorage function uses map.ToTable($"{schemaName}.jasper_dead_letters"); with a default schema name of "dbo" which when set or changed to a new value and used in conjunction with ef core snake case name translation creates a table named schemaName_jasper_dead_letters(the schema name becomes part of the table name) which means on app startup it ignores this table and creates a new table named public.jasper_dead_letters(which is right) with the restrictive column length defaults. Calling the MapEnvelopeStorage function with an empty string fixes the above table name "issue" but app startup still recreates the table with the restrictive defaults.

Jeremy D. Miller
@jeremydmiller
1.) I’ll happily take a PR to set that to max
2.) That’s documented. You have to opt into that behavior, so you’ve got that configured somewhere in your application. I think the example apps show you how to just enable that at development time.
3.) I’ll also happily take a PR because I’m not sure what your setup is
Anthony Acquah
@anthony.acquah_gitlab
Oh I see. I'll RTFM and work on the PRs. Thanks
Anthony Acquah
@tonymobster
For 1. would you mind if I change to a text column instead of VARCHAR(MAX)? And for 3. was it intentional that only DeadLetterEnvelope prepends schemaName to the table name?
Jeremy D. Miller
@jeremydmiller
it’s not purposeful. I think that’s okay to make the database change. It’s technically a breaking change, but I don’t think anybody uses it now
Anthony Acquah
@tonymobster
cool, i'll stick to varchar(max) to avoid the breaking change since switching to text doesn't provide much benefit. I'll add schema name to the others for consistency
Anthony Acquah
@tonymobster
This message was deleted
Anthony Acquah
@tonymobster
also the EnvelopeStatus enum mapped to varchar(25) in the script but ef core maps it to an int by default for postgres which causes the query to fail. I'll fix that as well
Jeremy D. Miller
@jeremydmiller
Oh, good catch. I hadn’t tested it w/ EF + Postgresql
Anthony Acquah
@anthony.acquah_gitlab
Submitted the PRs @jeremydmiller take a look whenever you have time
Jeremy D. Miller
@jeremydmiller
Will do
Hopefully today, but you know how that goes
Nico Sap
@NicoJuicy

I'm not sure on where i should ask questions about Domain Driven Design, but i'm currently a bit stuck and don't know where to ask.

Any advice on communication between bounded contexts in a monolith? I'm using the Application + Core + Infrastructure layer of the Clean Architecture.

Problem description: Basket Module has it's own context, but for AddBasketItemCommandHandler , will need a call to the GetProductByIdQuery. Which is in the Catalog Module. Since i'm also saving Product Information ( = Title, Weight, State, Pricen OldPrice).

Currently, i'm using mediator to do this and then map the product information it to the BasketItem.
So i add a reference from Basket.Application to Catalog.Application for this.

In a microservice, a httpclient to the CatalogApi would be created to fetch the information. From my POV i'm just eliminating the REST overhead.

Would this be correct? Have i overlooked something or can it be better?

abdulhye-doosan
@abdulhye-doosan
Hello @jeremydmiller .. we are trying to use LocalTransport to communicate in memory between different services. How can localtransport be used to communicate messages between different microservices within same process ?
abdulhye-doosan
@abdulhye-doosan
We have a container service , containing multiple micro-services that are each in their own host. We have created a wrapper around LocalTransport and injected it in contained microservices. Use Extension, like AzureServiceBus example to PublishMessagesToQueue and ToListenMessageFromQueue . our wrapper around LocalTransport introduces new protocol say myprotocol:// rest all implementation is that of LocalTransport
When we try to publish messages to queue, it says routing to particular queue url example: myprotocol://queue1 not found .. can you plz guide us where we can put breakpoints to debug this ?
Jeremy D. Miller
@jeremydmiller
@abdulhye-doosan What do you mean “different services in the same process”? Is this 2 .Net service classes in the same application bootstrapped with the same generic host? Or two separate IHost objects?
abdulhye
@abdulhye

@abdulhye-doosan What do you mean “different services in the same process”? Is this 2 .Net service classes in the same application bootstrapped with the same generic host? Or two separate IHost objects?

Two Separate IHost objects within same process

Jeremy D. Miller
@jeremydmiller
Yeah, there’s no facility for that. It’s not a static member. The local queues are singletons within the single IHost. Any reason why you have to have separate IHosts?
ndcomplete
@ndcomplete

Just to close this out and give some extra clarification (I work with abdul), the reason that we have separate hosts is because we've created a service who is able to start up multiple of our other microservices inside of it, so that we can do networkless/serializationless transport in some instances, such as long-term simulations.

We thought about throwing all the options into one big host, but were worried about crosstalk between the dependencies, for instance if two different services consume the same interfaced object. I briefly thought about using nested containers (I was one of the monsters that used them a bunch with StructureMap), but decided that was a rabbit hole we didn't necessarily want to go down.

We figured out what we were missing though: when making the sending agents, the handler pipelines were not getting shared with our custom transport implementation. We created a wrapper IHandlerPipeline which accepts multiple injected HandlerPipelines and connects them up in the single sender inside the SendingAgent. This is a biiiit of a hack, but seems to be working decently well. Still ironing out some of the kinks, such as making a different collection for each configured queue, but I think that will mainly be a performance benefit so it doesn't have to check every pipeline per message, as our messages are strongly typed (though I think the namespace gets pulled out of the type name, so that may not be any protection).

I'm going to try and get permission from on high to open source some of the work we're doing on this, as I think it's pretty interesting in some cases. Would definitely be interesting to see what you think on it!

Jarrod Johnson
@JarrodJ83
Has anyone ever converted ST results into a format that can be displayed in Jenkins Pipelines?
Jeremy D. Miller
@jeremydmiller
Not that I’m aware of. There’s a hook for formatting the console results that worked for TeamCity
Jarrod Johnson
@JarrodJ83
Thanks I'll check it out!
Jeremy D. Miller
@jeremydmiller
I won’t have bandwidth for Jasper anytime soon, but OpenTelemetry support and perf optimization is the last 2 things for a 2.0
Jarrod Johnson
@JarrodJ83
I'm doing some work with open telemetry and pulsar.client soon. If all goes well I would be open to trying to implement in jasper as well
Nico Sap
@NicoJuicy
Am i correct to assume Jasper is a good fit for using as a Saga ( that can be persisted) and plumbed with Mediator? ( since it's a monolith for now)
Jeremy D. Miller
@jeremydmiller
Yes, and I see your question in the Marten room. Jasper supports the Saga pattern w/ Marten being one of the persistence strategies. Jasper is also a superset of the MediatR functionality
Nico Sap
@NicoJuicy
Yeah indeed. Okay, thx
I remembered the repo of Oskardudycz, checked his repository and saw something very similar to what i wanted. So i posted it on 2 channels since i didn't saw him post here, perhaps not the best idea, sorry
Jeremy D. Miller
@jeremydmiller
No worries, I follow both rooms:)
ndcomplete
@ndcomplete
@jeremydmiller I have a set of merge requests coming in: one for Oakton.AspNetCore, then one for Jasper following. I'm going to wait for the Oakton one to be finished (if you decide to approve it), as it is a dependency for the Jasper change. If you'd like, I'd be happy to push up a branch with the majority of the Jasper changes required, with a stub for the Oakton update, so you can see the intent of the changes.
ndcomplete
@ndcomplete
Here's the jasper changeset. Note that in a further changeset I reverted some of the unnecessary changes (temporary oakton version change and language change):
ndcomplete/jasper@e6e4557
Mark Warpool
@CodingGorilla
@jeremydmiller I have an app that's using 1.1.4 and seems to be only running one handler at a time. I can see that it has 4 messages queued up in the incoming messages table, but my telemetry only shows it running one handler. Any quick thoughts on things to check to figure out why?
Mark Warpool
@CodingGorilla
Wondering if I need to explicitly set the MaximumThreads() to something greater than one, it looks like the ExecutionDataflowBlockOptions.MaxDegreeOfParallelism defaults to 1.
Jeremy D. Miller
@jeremydmiller
It should be defaulting to 5 in Jasper (super arbitrary number), but that wouldn’t impact how many handlers are known in the system. Can you resolve HandlerGraph and see if there’s more than the one handler?
It would super help right now if I had Oakton Describe() commands in there for Jasper :/
Mark Warpool
@CodingGorilla
Looking through the Jasper source, I can't see where it sets the MaxDegreeOfParallelism to anything other than what the default value for ExecutionDataflowBlockOptions is based on the default constructor.
The issue appears to be that it runs multiple handlers in parallel, but if I have 5 messages of one handler type, it runs those in sequence. Which lines up with the Dataflow library says I should expect (unless I'm missing something)