1
00:00:01,080 --> 00:00:04,799
How'd you like to listen to dot
net rocks with no ads? Easy?

2
00:00:05,360 --> 00:00:09,480
Become a patron for just five dollars
a month. You get access to a

3
00:00:09,480 --> 00:00:14,240
private RSS feed where all the shows
have no ads. Twenty dollars a month.

4
00:00:14,279 --> 00:00:18,440
We'll get you that and a special
dot net Rocks patron mug. Sign

5
00:00:18,519 --> 00:00:35,560
up now at Patreon dot dot NetRocks
dot com. Hey guess what, it's

6
00:00:35,560 --> 00:00:39,000
dot net rocks. I'm Carl Franklin, an amateur cable We just had a

7
00:00:39,039 --> 00:00:46,000
conversation before SERGEI came online about phishing, and because I was watching the show

8
00:00:46,039 --> 00:00:50,240
called Bizarre Foods America with Andrew Zimmern. It's an old show, right,

9
00:00:50,280 --> 00:00:53,920
it's been on many years, but
I love watching reruns of things that are

10
00:00:53,960 --> 00:00:56,560
interesting. And he was in Vancouver. Yeah, yeah, and he goes

11
00:00:56,600 --> 00:01:00,280
to tojo like the guy who invented
the californiyear old and I got you there,

12
00:01:00,479 --> 00:01:04,799
right, yes you did? Yeah, And Aerosmith walked in right yeah,

13
00:01:04,879 --> 00:01:07,840
right while we were there. That's
right, you did that over the

14
00:01:07,840 --> 00:01:11,599
shoulder shot. Yeah. And my
friend said, hey, who's that guy

15
00:01:11,680 --> 00:01:17,680
talking to my aunt? Edna?
Steven Tyler. Steven Tyler has aged interestingly

16
00:01:17,799 --> 00:01:26,120
dude looks like a grandma. Now. Anyway, that was a fun conversation,

17
00:01:26,159 --> 00:01:29,719
but that's not what we're here for. Let's get into better no framework

18
00:01:29,760 --> 00:01:38,599
and start this thing. All right, man, what do you got?

19
00:01:38,680 --> 00:01:45,439
All right? I found this list, a curated list of awesome open source

20
00:01:45,719 --> 00:01:51,920
projects on the web, and it's
called awesome oss. It's a GitHub repo

21
00:01:52,120 --> 00:01:56,079
and it's at Serene Blue. And
I love these curated lists, and man,

22
00:01:56,120 --> 00:02:00,640
I wish we had these more in
every category of life, like music

23
00:02:00,719 --> 00:02:05,519
for example. You know, used
to have an uncle who had a record

24
00:02:05,560 --> 00:02:09,080
collection who you could just go to
and say, hey, what's really cool

25
00:02:09,159 --> 00:02:13,360
right now? And they would say
I love this yeah, and you listen

26
00:02:13,439 --> 00:02:17,840
to it and it's great. So
developer tools is just one of the categories

27
00:02:17,840 --> 00:02:23,000
in here. But the categories are
there's only a few audio editors, audio

28
00:02:23,039 --> 00:02:29,800
players, documents, developer tools,
email foundations, FTP clients, games,

29
00:02:29,879 --> 00:02:35,599
graphics, multimedia, networking, OS
distributions, other password managers, payments,

30
00:02:35,639 --> 00:02:38,919
social text editors, video software,
web browsers. I went looking in you

31
00:02:38,960 --> 00:02:44,039
know, non developer tool stuff,
sure, and there's so many cool projects

32
00:02:44,080 --> 00:02:47,039
that I had no idea. The
curation he's done here where he's actually found

33
00:02:47,120 --> 00:02:51,319
the links for how you donate as
well as how you contribute, Like,

34
00:02:51,879 --> 00:02:53,879
this is a ton of work to
make this list. A lot of work.

35
00:02:54,000 --> 00:02:58,560
Yeah, yeah, no, I
really appreciate that. Yeah. I

36
00:02:58,599 --> 00:03:01,159
didn't see anything where you could donate
to him. No, no, not

37
00:03:01,319 --> 00:03:04,560
it all. But I think that's
what this is about. I mean,

38
00:03:04,599 --> 00:03:06,960
in the end, I mean,
they're still maintaining it. But this is

39
00:03:06,960 --> 00:03:10,240
a properly configured open source project too, right. I appreciate that it has

40
00:03:10,280 --> 00:03:16,159
an MIT license. That's great.
It's kind of funny. But yeah,

41
00:03:16,199 --> 00:03:21,240
they to do the work of saying
here's the project, here's the source cover

42
00:03:21,280 --> 00:03:23,520
repositor. If you want to contribute
code, here's how they take donations,

43
00:03:23,560 --> 00:03:27,560
if you want to contribute money.
It's really awesome, that's really great.

44
00:03:27,719 --> 00:03:31,960
Yeah, so hats off to Serene
Blue for curating that list. Who's talking

45
00:03:32,000 --> 00:03:36,919
to us? Richard grabbed a comment
off of show eighteen eighty, which was

46
00:03:37,000 --> 00:03:38,680
just a couple of weeks ago,
right, yeah, right, which is

47
00:03:38,719 --> 00:03:42,800
why we're here actually, because when
we were recording that show with Jimmy Bogart

48
00:03:42,840 --> 00:03:46,000
about migrating to dot net eight he
called out hang fire. Yeah, and

49
00:03:47,000 --> 00:03:50,159
and right away I made a notice. I'm going to go look up what

50
00:03:50,199 --> 00:03:53,719
hangfires. I hadn't heard about it
before, but one of our long time

51
00:03:53,759 --> 00:03:55,840
listeners, Dave Ackkroyd, also immediately
commented on that show. He said,

52
00:03:55,879 --> 00:04:00,240
this is a great episode. I'll
be recommending my colleagues listen, though they

53
00:04:00,240 --> 00:04:01,840
should be listening to all of them
anyway. Uh, and I'm not.

54
00:04:01,919 --> 00:04:04,520
That's not an editorial. I mean, that's what Dave said. That's why

55
00:04:04,560 --> 00:04:09,840
we love Dave. I had my
ears prick up the moment when Jimmy mentioned

56
00:04:09,919 --> 00:04:13,199
hang fire, as that is a
service I work with a lot on my

57
00:04:13,280 --> 00:04:16,360
current job. I would love to
hear from them, especially as I'm currently

58
00:04:16,399 --> 00:04:19,759
using it on dot Net framework and
looking to the dot Net Core. Would

59
00:04:19,800 --> 00:04:25,160
open up some other hosting options besides
an EC two instance running on Windows server

60
00:04:26,800 --> 00:04:29,600
or running Windows Server on EC two
instance. That sounds right. I like

61
00:04:29,639 --> 00:04:33,680
that better. My ideal world would
have no i as, and so knowing

62
00:04:33,720 --> 00:04:38,279
some more around options for platform as
of service would be great to hear.

63
00:04:38,839 --> 00:04:41,560
Sorry, Dave, Yeah, we
can't help you. No, Nope,

64
00:04:41,680 --> 00:04:44,160
not that they could do there.
We're not going to go there, not

65
00:04:44,199 --> 00:04:49,360
gonna do it and come, you
know. Fortunately, in my initial research,

66
00:04:49,439 --> 00:04:54,240
and seeing the encouragement from David so
Forth, I reached out to Sergey,

67
00:04:54,360 --> 00:04:57,800
who was very responsive to us,
and so here we are just a

68
00:04:57,800 --> 00:05:01,639
few weeks later. Very cool.
I know you got a copy of us

69
00:05:01,680 --> 00:05:03,920
iccode by already. I think you
got all the things one way or the

70
00:05:03,920 --> 00:05:08,120
other. But pick me later and
we'll chat. Thanks so much for your

71
00:05:08,120 --> 00:05:10,120
comment and a copy of music,
cob By. It's on its way to

72
00:05:10,160 --> 00:05:12,519
you. And if you'd like a
copy of musicobe I write a comment on

73
00:05:12,519 --> 00:05:15,800
the website at Donna at rocks dot
com or on the social media's like Facebook,

74
00:05:15,000 --> 00:05:17,120
publish every show there, and if
you comment there and are reading the

75
00:05:17,120 --> 00:05:19,639
show, we'll send you copy of
music kobay and you can follow us on

76
00:05:19,680 --> 00:05:23,680
Twitter if you want, or x
or whatever they call it. I'm at

77
00:05:23,680 --> 00:05:27,160
Carl Franklin, he's at Rich Campbell, but the cool kids are hanging out.

78
00:05:27,199 --> 00:05:30,439
I'm Masterson. I'm at Carl Franklin
at tech cub dot social, and

79
00:05:30,560 --> 00:05:34,279
I'm Rich Campbell at Macedon dot social. Send us a tuote. We will

80
00:05:34,279 --> 00:05:38,079
definitely read it. That's all we're
committing to. Yeah, that's all.

81
00:05:38,720 --> 00:05:41,639
Quietly, we might make fun of
it, yeah, but publicly we always

82
00:05:41,680 --> 00:05:46,279
say nice things. We're nice guys, at least on a podcast. We

83
00:05:46,319 --> 00:05:49,079
are. Yeah, that's right,
we play nice guys on a podcast.

84
00:05:49,120 --> 00:05:56,639
Okay, close enough, let's bring
on. Odie Knockoff is a proud husband

85
00:05:56,639 --> 00:06:00,319
and father of two kids, currently
living in Thailand. He's been in offerare

86
00:06:00,319 --> 00:06:04,279
development for more than fifteen years,
looking to find the exact reason why concurrent

87
00:06:04,560 --> 00:06:11,079
parallel distributed programming is so difficult.
I hope he's hearing it enlighten us.

88
00:06:11,079 --> 00:06:14,560
I know he will. Welcome serge. Hi, everyone, how are you

89
00:06:14,639 --> 00:06:18,439
doing? Thank you for the invitation. I'm doing fine, but my bed

90
00:06:18,600 --> 00:06:24,720
is tired. Yeah. Yeah,
this is a very much around the world

91
00:06:24,800 --> 00:06:29,240
recording. You're in Thailand, I'm
in BC Carls, Connecticut. Like we're

92
00:06:29,240 --> 00:06:31,759
covering all the time zones. Yep. This is amazing that we can all

93
00:06:31,800 --> 00:06:36,959
be here together on riverside. But
let's talk about hang fire now. I'm

94
00:06:38,000 --> 00:06:41,000
just going to give the quick you
know, read what the website says.

95
00:06:41,000 --> 00:06:45,399
It's very easy to understand. An
easy way to perform background processing in dot

96
00:06:45,480 --> 00:06:50,800
net and dot net core applications.
No Windows service or separate process required,

97
00:06:51,240 --> 00:06:57,519
backed by persistent storage, open and
free for commercial use. Wow, legit,

98
00:06:57,680 --> 00:07:01,600
that's and that's quite an undertaking.
My friend and colleague Brian McKay,

99
00:07:02,000 --> 00:07:04,759
when I told him we were interviewing
you, said, holy crap. We

100
00:07:04,839 --> 00:07:09,360
used to use hang fireback in the
dot net framework days and he had no

101
00:07:09,480 --> 00:07:15,199
idea that you could run it encore. Oh yes you can. So it

102
00:07:15,399 --> 00:07:19,839
centers around this idea of jobs,
and you have just right on the homepage,

103
00:07:19,839 --> 00:07:24,519
you know, examples of what the
different kinds of jobs are, fire

104
00:07:24,560 --> 00:07:30,920
and forget, delayed jobs executed only
once, but not immediately after a certain

105
00:07:30,959 --> 00:07:35,399
time interval, recurring jobs like on
the specified Crawn schedule. So wow,

106
00:07:36,040 --> 00:07:42,360
that's great. Continuations which are executed
when its parent job has been finished.

107
00:07:43,040 --> 00:07:46,519
And then the pro version has this
thing about batches. We'll get into that

108
00:07:46,079 --> 00:07:50,759
a little bit later. But man, this looks great and so necessary and

109
00:07:50,839 --> 00:07:58,480
so easy. Thank you. How
long you been doing this now more than

110
00:07:58,560 --> 00:08:03,959
ten years already, Guinness. It
will be eleven birthday this year in August,

111
00:08:05,279 --> 00:08:11,959
as I remember, I started it
in twenty thirteen. First commit it

112
00:08:11,120 --> 00:08:16,319
was in another life. What was
your inspiration? I mean, did you

113
00:08:16,399 --> 00:08:18,959
have like a problem that you said, you know, I need something like

114
00:08:20,000 --> 00:08:26,160
this so you wrote it for yourself
or well that My problem was I found

115
00:08:26,199 --> 00:08:35,480
myself implemented the same beats from project
to project on my jobs. So I

116
00:08:35,559 --> 00:08:43,279
waited for a long time that another
one more experienced developer implement these. I

117
00:08:43,320 --> 00:08:50,320
was waiting for about four years,
but I saw almost nothing. Most project

118
00:08:50,759 --> 00:08:56,120
or dead because the period, and
after a year or two it became up

119
00:08:56,320 --> 00:09:00,000
torment. So you have that healthy
instinct of this is such a good idea,

120
00:09:00,120 --> 00:09:03,200
somebody else must have already done this. Yes, yes, yes,

121
00:09:03,919 --> 00:09:09,799
I was looking on other platforms like
ururban rails, like Python. I saw

122
00:09:09,919 --> 00:09:16,480
Sidekik, Cillary and other interesting projects, and I was dreaming that someone will

123
00:09:16,519 --> 00:09:24,120
implement this because I really tired implementing
the same and the same on dark Night

124
00:09:24,120 --> 00:09:28,879
platform. Yeah so you I mean
you mentioned Celery and that's built for a

125
00:09:30,279 --> 00:09:33,960
what platform is that for? It's
Python. It's a Python, That's what

126
00:09:33,960 --> 00:09:39,679
I was thinking. Do you see
that as an inspiration? Like that's just

127
00:09:39,720 --> 00:09:46,080
a give me one of those that
please, just just just top level.

128
00:09:46,360 --> 00:09:52,519
I didn't go into the details.
I was looking at API was dreaming,

129
00:09:52,440 --> 00:09:56,399
right, yeah, yeah, yeah, I just hoping that you know,

130
00:09:58,559 --> 00:10:01,480
you don't want to have to happily
use somebody else's if you could have.

131
00:10:01,799 --> 00:10:07,519
Yes, yes, sure, because
the ground jobs today projects are more complex

132
00:10:07,639 --> 00:10:11,840
than in the early days of the
internet, and almost every project I need

133
00:10:11,919 --> 00:10:18,399
some kind of ground processing. I
was surprised to see that there is no

134
00:10:18,679 --> 00:10:24,799
movement in the network. I saw
some projects. That's what that already as

135
00:10:24,840 --> 00:10:31,639
I already mentioned, because it's difficult
to be to build a sustainable open source

136
00:10:31,720 --> 00:10:39,120
projects. So that's but I think
that's another story. No, but,

137
00:10:39,279 --> 00:10:43,720
and I when it's super relevant on
the show that you know how you built

138
00:10:43,720 --> 00:10:48,600
this out of your own need,
but you've got a huge raft of contributors

139
00:10:48,600 --> 00:10:52,200
too, so obviously with a need
by other folks that they've helped you out

140
00:10:52,360 --> 00:10:56,440
or been a part of the process. Yeah, sure, because contributors published

141
00:10:58,200 --> 00:11:01,919
a huge number of things. Because
sometimes you don't have time to fix some

142
00:11:03,279 --> 00:11:11,519
rare features or very rare use cases, and contributors make a huge contributions help

143
00:11:11,600 --> 00:11:16,960
a lot you polish some advancity use
cases. I noticed that you have an

144
00:11:18,039 --> 00:11:22,720
architectural diagram which is very helpful,
but it has like the user and then

145
00:11:22,840 --> 00:11:30,440
the hang fired scheduler and then a
server. But as you mentioned in the

146
00:11:30,559 --> 00:11:33,799
very first paragraph on your website.
You don't have to go out of process.

147
00:11:35,279 --> 00:11:39,480
This is just a you know,
a logical server, if you will,

148
00:11:39,559 --> 00:11:43,720
right, logical server. Yeah,
yeah, yeah, But you can

149
00:11:43,799 --> 00:11:46,840
move it out of process if you
want to, right. Yes. You

150
00:11:46,879 --> 00:11:52,720
can start in the same process to
keep things simple and later move it out

151
00:11:52,919 --> 00:11:58,440
to another process or another server when
needed. And the main things is that

152
00:11:58,720 --> 00:12:03,720
you're the top will not be complicated
when you do this because in both casse,

153
00:12:05,039 --> 00:12:09,240
if you perform the process in the
same process and in another process you're

154
00:12:09,320 --> 00:12:15,480
using the same configuration, you just
plug in the storage and let hunfar do

155
00:12:15,960 --> 00:12:20,559
right. So you don't need any
kind of inter process communication because it's all

156
00:12:20,600 --> 00:12:24,240
persisting in a database. Yeah.
Yeah, that's very cool. Yeah.

157
00:12:24,480 --> 00:12:28,919
And by database it looks like you
mean just about anything the process I suspect

158
00:12:28,960 --> 00:12:31,080
I could probably drop the state information
into a file and you could pick it

159
00:12:31,120 --> 00:12:35,600
back up and keep going. Not
quite, because official is supported a skill

160
00:12:35,759 --> 00:12:43,559
server and already and in memory for
simplified development, et cetera. But there

161
00:12:43,559 --> 00:12:50,399
are a lot of community by the
storages that are implemented by other people,

162
00:12:50,840 --> 00:12:58,480
other contributors, so I don't think
it's easy to use file lists but it

163
00:12:58,480 --> 00:13:05,759
can be at least implemented. Sure. So when I was talking to Brian

164
00:13:05,840 --> 00:13:11,240
McKay, he wanted to know when
is a good time to use hang Fire

165
00:13:11,519 --> 00:13:18,720
versus some sort of cloud service you
know, Azure Functions or service Bus,

166
00:13:18,320 --> 00:13:22,799
because he says, we use that
pattern a lot. I think it depends

167
00:13:22,840 --> 00:13:30,960
on architecture because there are companies that
invest heavily in cloud infrastructure and I don't

168
00:13:31,000 --> 00:13:35,000
think I don't think there is need
to move to Fire or other on promise

169
00:13:35,080 --> 00:13:41,879
things for them, but it is
still possible. Nowadays, company looks for

170
00:13:41,080 --> 00:13:48,000
ways to keep it possible to move
to other vendors. Right. Platform independence,

171
00:13:48,720 --> 00:13:52,759
yes, yes, yes, And
it's difficult if you invest a lot

172
00:13:52,799 --> 00:13:58,559
of time, a lot of development
into one concrete platform to move switch to

173
00:14:00,159 --> 00:14:05,879
another one. So if a company
wants to invest more in a platform independence,

174
00:14:07,159 --> 00:14:13,559
then it's a great opportunity to use
Fire. I imagine that when it

175
00:14:13,600 --> 00:14:20,559
comes to scaling, right, your
database might be the the you know,

176
00:14:20,600 --> 00:14:24,600
the point at which you want to
put your resources into. You know,

177
00:14:24,720 --> 00:14:30,919
it might be the bottleneck. Can
you use just standard caching? Is that

178
00:14:30,960 --> 00:14:33,399
going to screw up the whole process? If we I mean, I mean

179
00:14:33,440 --> 00:14:39,039
it's really true. It's really about
writing to the database. But there's obviously

180
00:14:39,039 --> 00:14:43,399
your services in the background are reading
that database. And if you cash,

181
00:14:45,159 --> 00:14:48,200
is there a possibility that something will
be missed? How do you feel about

182
00:14:48,200 --> 00:14:56,000
that. It's possible to use different
databases for applications, data and for and

183
00:14:56,120 --> 00:15:01,480
far and fire has a right heavy
workloads, so it's difficult to catch anything

184
00:15:01,639 --> 00:15:09,000
there because everything is constantly changed,
like the ground jobs that move from one

185
00:15:09,080 --> 00:15:15,159
state to another. So whattlelike is
an interesting problem and I'm afraid there is

186
00:15:15,240 --> 00:15:22,320
no solution of them charging. Yeah. Yeah, you can use multiple storages

187
00:15:22,519 --> 00:15:28,559
incanfi and create the ground jobs in
one or another storage. So on the

188
00:15:28,600 --> 00:15:33,639
server aspect, you know, the
thing that reads the database in fires off

189
00:15:33,679 --> 00:15:41,279
the jobs and all that stuff is
there in memory. Cash with notification that

190
00:15:41,320 --> 00:15:46,240
the database has changed for you,
so that you're not constantly polling the database.

191
00:15:46,279 --> 00:15:48,840
How does that work? It depends
on the storage because, for example,

192
00:15:50,360 --> 00:15:56,320
Alreadius has blocking commands. But actually
that's why people love radis. Yeah

193
00:15:56,399 --> 00:16:00,600
yeah, but actually the most popular
client for red this is stach exchange rate

194
00:16:02,039 --> 00:16:08,759
doesn't support blocking comments. So this
is a kind of pops up magic punitions.

195
00:16:10,240 --> 00:16:15,720
And subscribe. I'm talking about a
squall server. It has some motification

196
00:16:15,039 --> 00:16:21,600
about Historically it's complicated, right,
you have to do triggers and things,

197
00:16:21,679 --> 00:16:27,919
right, dependency. I even forgot
the name of it. There. Once

198
00:16:29,000 --> 00:16:33,200
upon a time seql server had notification
services. Yeah, yeah, yeah,

199
00:16:33,279 --> 00:16:37,240
yeah, yeah yeah. And to
simplify things, I will I was trying

200
00:16:37,279 --> 00:16:44,480
to discover a more or less efficient
way of pulling and let's versions. It

201
00:16:44,600 --> 00:16:51,399
has central bags, but it works, it works well practically, so very

202
00:16:51,399 --> 00:16:53,440
good. Yeah. And I noticed
that you start with sql server two thousand

203
00:16:53,480 --> 00:16:56,960
and eight R two. It's like
the base model, and that's the original

204
00:16:56,080 --> 00:17:00,080
version for notification services, as I
recall. Isn't that funny? Yeah,

205
00:17:00,120 --> 00:17:07,720
but they require additional loanments, additional
database configuration, and right in the early

206
00:17:07,839 --> 00:17:15,319
days they didn't work well. Memory
leaks are possible because I remember, yeah

207
00:17:15,440 --> 00:17:19,720
I recall living in the DBA land
at that time, and we were usually

208
00:17:19,759 --> 00:17:25,079
pretty hesitant to turn notification services on. So to have a dev come out

209
00:17:25,279 --> 00:17:26,559
and say, hey, we really
want to do this, can you can

210
00:17:26,559 --> 00:17:32,680
we have notification services like we would
push back, It's like that's another thing

211
00:17:32,720 --> 00:17:34,640
we need to monitor. It's a
bit cranky so we're going to need some

212
00:17:34,680 --> 00:17:38,240
restart mechanisms like all of that kind. I remember in the old days,

213
00:17:38,400 --> 00:17:42,440
and I can't remember exactly when,
but it was probably before two thousand and

214
00:17:42,480 --> 00:17:48,000
six that we used to do triggers. Fernando Guerrero taught me how to do

215
00:17:48,039 --> 00:17:57,960
this, to write a trigger on
insert that could notify your code somehow.

216
00:17:59,039 --> 00:18:00,920
And I can't it's been so long, I can't remember, but I remember

217
00:18:02,160 --> 00:18:07,640
actually showing this in a in a
webinar, because as of SQL Server two

218
00:18:07,680 --> 00:18:11,079
thousand and five, you could make
a dot net call out of a store

219
00:18:11,119 --> 00:18:14,279
procedure. Yeah, that's right,
So you could have embedded in that on

220
00:18:14,880 --> 00:18:19,000
insert trigger on an external call like
at gRPC or something like that. You're

221
00:18:19,039 --> 00:18:22,680
you're interesting, fifteen years too early
for GRP. No, but now you

222
00:18:22,720 --> 00:18:26,799
could, right. I mean they
didn't take the runtime out of SQL service.

223
00:18:26,839 --> 00:18:29,319
No, No, it's still air. It's off by default, but

224
00:18:29,359 --> 00:18:33,039
it's always been off by default.
Yeah, people abuse it. You know,

225
00:18:33,839 --> 00:18:37,640
you don't want to put an external
call into an aggregate function. No,

226
00:18:37,880 --> 00:18:45,480
bad, that would be bad,
Serge. Were there any features that

227
00:18:45,519 --> 00:18:48,759
you added that came from your customers
or you know, people who are using

228
00:18:48,759 --> 00:18:52,720
it I'm sure there were, But
do you have any stories about that?

229
00:18:52,720 --> 00:18:57,400
That's a great question, because thank
you. The whole story of Ganphar is

230
00:18:57,680 --> 00:19:04,920
everything is mixed together. Customer greary
is my own thoughts. So it's I

231
00:19:04,960 --> 00:19:08,599
don't know how to say it in
English, so yeah, no, I

232
00:19:08,680 --> 00:19:15,119
will really with everybody's input, Yeah, yeah, yeah, yeah, everybody

233
00:19:15,240 --> 00:19:18,759
was. I was involved. I've
tried hard to understand customers, to understand

234
00:19:19,039 --> 00:19:26,039
developers, and implement things as simple
as it possible, because because you know,

235
00:19:26,359 --> 00:19:33,680
no one wants to spend time supporting
difficult things. And what about crazy

236
00:19:33,720 --> 00:19:37,559
ideas? Does anybody come up to
you like a crazy idea that after about

237
00:19:37,960 --> 00:19:42,839
minute thought you just said, no, what you talk? What's that stupid

238
00:19:42,839 --> 00:19:49,759
idea? I think the most craziest
idea was my decision to add support of

239
00:19:49,880 --> 00:19:57,480
both no Skill and Relational Skill databases
in the early days. And no one

240
00:19:57,640 --> 00:20:11,960
told me don't do this. Trial
by hang fire. Yeah, because it's

241
00:20:11,160 --> 00:20:18,279
really difficult to mix so different things
in one a BI and to make them

242
00:20:18,359 --> 00:20:26,359
work. Because even now, when
I'm trying to document storage API, every

243
00:20:26,400 --> 00:20:34,480
time, I understand I can do
this right now because there there are so

244
00:20:34,559 --> 00:20:41,960
many words missing, and there are
a lot of concepts missing when you need

245
00:20:41,000 --> 00:20:48,640
to make friendship between locks, transactions
and other things. Yeah, are you

246
00:20:48,799 --> 00:20:52,079
using on the back end you go
all the way down the threads or are

247
00:20:52,119 --> 00:20:57,119
you trying to stick the tasks in
a task parallel library in a sink away.

248
00:20:57,279 --> 00:21:03,200
That's that's another great question. Thanks. That's what I do, by

249
00:21:03,240 --> 00:21:10,200
the way, And I started by
using threads. Then I switched to tasks,

250
00:21:10,359 --> 00:21:17,000
but on running task that are threats
under the surface. But then I

251
00:21:17,200 --> 00:21:26,279
even tried hard to build a synchronous
API as synchronous processes asynchronous not a synchronous

252
00:21:26,400 --> 00:21:33,000
process us. Yeah. Yeah,
I'm still learning. I was learning.

253
00:21:33,440 --> 00:21:45,039
I was learning English by writing documentation
to him fire awesome. So I'm still

254
00:21:45,119 --> 00:21:49,440
trying. You know, you're doing
great. You're doing great. I'm thinking

255
00:21:49,559 --> 00:21:52,079
back with it. Stephen Taboo said, this is like, listen, there's

256
00:21:52,119 --> 00:21:56,839
only three people that really understand multi
threaded programming, and two of them are

257
00:21:56,960 --> 00:22:08,680
lying the other one. I used
to teach multi threaded programming as a concept,

258
00:22:10,480 --> 00:22:15,000
and what I did was I used
Gary Kasparov actually as an example.

259
00:22:15,400 --> 00:22:21,000
I said, Gary Kasparoff is playing
chess in the park with those big stone

260
00:22:21,119 --> 00:22:23,279
chess boards. You know, they
are arranged in a circle like Stonehenge,

261
00:22:23,720 --> 00:22:27,079
and he's got you know, twenty
people. He's playing twenty games at once.

262
00:22:27,160 --> 00:22:30,799
He plays, he makes a move, he goes to the next one.

263
00:22:30,880 --> 00:22:33,640
He makes a move, and he
goes to the next one. And

264
00:22:33,160 --> 00:22:37,160
so that's how he can play twenty
games at the same time, but just

265
00:22:37,240 --> 00:22:41,160
make one move at a time.
And that's kind of the idea of threads.

266
00:22:41,400 --> 00:22:45,839
You know, down in the operating
system that the OS gives attention to

267
00:22:45,000 --> 00:22:49,640
one thread at a time and makes
a certain number of moves, a certain

268
00:22:49,720 --> 00:22:53,400
number of registers or whatever, makes
a call, and then moves on to

269
00:22:53,480 --> 00:22:59,519
the next one. So it's kind
of fortuitous that, you know, Gary

270
00:22:59,559 --> 00:23:04,480
casper off Man, he's a multi
threaded man. Yeah, he's a multi

271
00:23:04,599 --> 00:23:11,119
threaded man, both inside and outside
his brain. Yeah, yeah, I

272
00:23:11,160 --> 00:23:14,599
think we should take a break for
just a moment. Yeah, let's do

273
00:23:14,720 --> 00:23:22,559
that. We'll be right back after
these important messages and we're back. You're

274
00:23:22,559 --> 00:23:26,720
listening to dot net Rocks. I'm
Carl Franklin, and we're talking with Sergei

275
00:23:26,839 --> 00:23:32,440
Odie Knockoff about hang fire. We
were just talking about whether or not you

276
00:23:32,519 --> 00:23:36,559
know, you started with threads then
you went to tasks that use threads on

277
00:23:36,680 --> 00:23:40,720
the back end, and tasks men
all the way. That's what I say.

278
00:23:41,359 --> 00:23:44,319
Yeah, life is better that way. I hope I never have to

279
00:23:44,400 --> 00:23:51,519
use threads. How about locking mechanisms? Do you just use basic lock objects

280
00:23:51,599 --> 00:23:55,160
or do use semaphores? Or how
you know? What's your what's your?

281
00:23:56,119 --> 00:24:02,680
Do your locking mechanism? We can't
use a regular our logs or semaphos because

282
00:24:03,720 --> 00:24:07,559
they work only inside the same process, right, Yeah, you're right,

283
00:24:07,559 --> 00:24:15,000
and in far since we can move
process into another machine to use something else.

284
00:24:15,799 --> 00:24:22,359
There is an abstraction in storage API
called distributed lock. This was one

285
00:24:22,440 --> 00:24:27,400
of the most difficult points to make
them work and to make them work realiably

286
00:24:27,960 --> 00:24:33,759
because when talking about hand fire,
we can expect unexpected shut down in every

287
00:24:33,880 --> 00:24:40,799
line. So not only distributed locks
should work well, but the whole storage

288
00:24:41,240 --> 00:24:48,319
should work well, because we shouldn't
leave abandoned logs because they should be eventually

289
00:24:48,720 --> 00:24:55,799
released, and we should somehow mix
them with transactions to make out right to

290
00:24:56,559 --> 00:25:00,880
succeed. And hand fire is prepared
for expect to shut down every line,

291
00:25:02,559 --> 00:25:07,559
and it is really difficult to program
with this in mind. It looks like

292
00:25:07,759 --> 00:25:11,799
reddis supports, or you could do
distributed locks in reddist and maybe even something

293
00:25:11,839 --> 00:25:17,839
called zoo keeper. Have you looked
at that? Zoo Keeper sounds complicated.

294
00:25:19,599 --> 00:25:23,960
This whole thing sounds complicated. Yeah, yeah, yeah, yeah, that's

295
00:25:25,000 --> 00:25:33,400
why I'm trying to understand why it's
so complicated. It's ready in near bio,

296
00:25:33,119 --> 00:25:42,720
so infant far Distributed logs are tied
with transactions because radis supports transactions in

297
00:25:42,799 --> 00:25:52,200
a slightly different way than a relational
databases, but they work anyway. So

298
00:25:52,799 --> 00:25:59,960
I read that you have a retry
circuit breaker, number of retry attemps,

299
00:26:00,119 --> 00:26:03,640
you can customize your retry strategy,
and then I wondered, hey, is

300
00:26:03,720 --> 00:26:10,319
he using polly and I didn't see
that you are, So you're doing your

301
00:26:10,359 --> 00:26:15,519
own retri logic. I tried not
to introduce a lot of dependencies into hand

302
00:26:15,599 --> 00:26:22,400
fire because dependency eventually carted. Dependency
help. Yeah, it is in the

303
00:26:22,480 --> 00:26:30,039
dot net framework. You can create
an HDDP client factory with strategies or policies

304
00:26:30,119 --> 00:26:33,279
built in for retry. Is that
what you're using? No, No,

305
00:26:33,359 --> 00:26:37,279
you're doing your own. They're not
so complicated or so. Yeah, but

306
00:26:37,400 --> 00:26:45,200
you do allow the developer to specify
and customize the retry strategy if it doesn't.

307
00:26:45,400 --> 00:26:52,880
Yes, yea to some extent,
because it depends on complexity, on

308
00:26:53,039 --> 00:26:57,680
the number of fissures tries in hand. Fire not required to be difficult,

309
00:26:59,079 --> 00:27:03,519
not required to be complicated. So
they just work. Yeah, I JW

310
00:27:03,759 --> 00:27:14,359
technology, It just works. It
works. I think we invented a new

311
00:27:14,480 --> 00:27:25,039
slogan and fire good. I noticed
in the pricing model and it includes licensing

312
00:27:26,160 --> 00:27:32,960
that the open versions are LGPL three
licenses. Can you talk about that choice?

313
00:27:33,400 --> 00:27:37,440
Obviously this is probably decision you made
ten years ago. Yes. First

314
00:27:37,440 --> 00:27:42,079
of all, it was based on
Sidekick, right, I asked Mike Perhams

315
00:27:44,200 --> 00:27:49,640
my copy some things you told Yes. So there are a lot of things

316
00:27:51,079 --> 00:27:56,240
when you start your project. You
want to concentrate on features, on first

317
00:27:56,319 --> 00:28:00,400
implementations, and there are a lot
of everything else in your project, like

318
00:28:02,480 --> 00:28:08,680
licensing, like side like some kind
of marketing when you introduce your project,

319
00:28:10,200 --> 00:28:15,000
and you can do all the things
together so you can copy least important things

320
00:28:15,200 --> 00:28:22,880
and concentrate on more important things for
you. The same story was with lesser

321
00:28:22,000 --> 00:28:30,799
GPL license. Some people who are
asking to move to mt license on the

322
00:28:30,920 --> 00:28:37,799
course of years, but don't know
how to say this, I mean licensing

323
00:28:38,119 --> 00:28:42,839
works and I'm afraid of touching.
Yeah. No, changing a license is

324
00:28:44,119 --> 00:28:49,000
very challenging. Yes, yes,
because it can lead to a lot of

325
00:28:49,160 --> 00:28:56,799
consequences you can predict and lesser.
GPL works well for even for commercial use.

326
00:28:57,039 --> 00:29:06,440
It can people sometimes confuse it with
a GP license and and scared that

327
00:29:07,200 --> 00:29:12,599
they will need to open sources of
their own applications. Well, and that's

328
00:29:12,680 --> 00:29:18,599
the perception of all GPR licenses,
just not understanding that LGPL isn't like that.

329
00:29:18,079 --> 00:29:22,920
So I didn't know that. I
just learned that just now I thought

330
00:29:22,960 --> 00:29:27,519
anything GPL meant. I if I
were to say, implement poly around you

331
00:29:27,599 --> 00:29:33,000
know, my retry policies, I
would have to then submit that back to

332
00:29:33,119 --> 00:29:41,200
the project. But it's difficult,
it's complicated. It's complicated. Yes,

333
00:29:41,200 --> 00:29:48,519
they allow commercial use and this phrase
is highlighted on the site. Absolutely,

334
00:29:48,240 --> 00:29:55,920
and LGPL is it exists for how
many years? A long time? More

335
00:29:56,000 --> 00:30:03,440
than twenty years? Yeah, yeah, so I think time. And actually

336
00:30:03,960 --> 00:30:10,440
there are a lot of sites that
describe the differences, yes, of each

337
00:30:10,599 --> 00:30:15,799
license nowadays. So sometimes I get
these questions, I answer, I answer

338
00:30:15,880 --> 00:30:22,000
them. People I can use it, so I can I wonder if you

339
00:30:22,079 --> 00:30:27,119
don't have developers who have a limited
amount of knowledge about over source licensing,

340
00:30:27,160 --> 00:30:30,680
but they've been told by their company
as long as it's MIT, it's fine,

341
00:30:32,359 --> 00:30:34,039
and that's all they know and so, and that's why they're pushing on

342
00:30:34,160 --> 00:30:37,240
you. It is like, could
I have MIT please, because my boss

343
00:30:37,279 --> 00:30:41,799
already told me that's okay. Yeah, these companies can buy a commercial license,

344
00:30:42,039 --> 00:30:45,000
and I thought that was so.
As soon as I saw this page,

345
00:30:45,519 --> 00:30:49,559
I thought this is brilliant. If
you're not willing to learn the rules

346
00:30:49,599 --> 00:30:53,240
of LGPL, you can pay to
make it go away. Yeah yeah,

347
00:30:53,559 --> 00:30:59,200
yeah, sure, so smart because
if you learn the rules, I mean

348
00:30:59,279 --> 00:31:02,880
all LGPR well and correct me if
I'm wrong. Here says is if you

349
00:31:03,039 --> 00:31:06,759
make improvements to this, if you
make changes to it, contribute them back.

350
00:31:07,279 --> 00:31:11,720
Yeah. Yeah. One of the
main points is LGBL license allows to

351
00:31:11,960 --> 00:31:18,640
avoid competitions with ourselves. Right,
Okay, when you have twenty fire like

352
00:31:18,759 --> 00:31:30,200
projects and you have to compute with
your own code, right, it's strench

353
00:31:30,359 --> 00:31:36,200
for me. Okay. Can we
talk about the batch idea that's in the

354
00:31:36,279 --> 00:31:41,440
pro version, and the provision is
the paid version obviously, but batches and

355
00:31:41,519 --> 00:31:47,480
batch continuations. I mean, anybody
who's figured out and listening by now could

356
00:31:47,480 --> 00:31:51,319
probably figure out what we're talking about
here. A batches a group of background

357
00:31:51,440 --> 00:31:56,839
jobs created automatically and considered as a
single entity, and then a batch continuation

358
00:31:56,240 --> 00:32:01,759
is fired when all the background jobs
and a parent batch finish. Is there

359
00:32:01,960 --> 00:32:07,720
also a way to know when each
job in the batch has finished? Is

360
00:32:07,799 --> 00:32:12,680
that just a regular continuation continue job
with In other words, can you do

361
00:32:12,759 --> 00:32:15,279
both of these together? If I
have a batch continuation that fires when all

362
00:32:15,359 --> 00:32:21,359
of them happen, can I also
know when individual jobs fire? You can

363
00:32:21,480 --> 00:32:25,279
even create nested batches and nest that. That's crazy, you know, mister,

364
00:32:25,599 --> 00:32:32,759
and and and nested batch continuation that
continue and other continuations. So yikes,

365
00:32:34,039 --> 00:32:39,839
it's possible to mix things and build
a really complex work close. When

366
00:32:39,880 --> 00:32:43,799
I hear you describe that, I'm
like, wow, it's your foot.

367
00:32:44,480 --> 00:32:47,920
You know what's scary out there?
Somewhere there's somebody listening, say hey,

368
00:32:49,039 --> 00:33:00,440
I could configure this with YAML.
In the early days of Fire development,

369
00:33:00,599 --> 00:33:07,680
I was talking a one developer who
advised me to use XML for configure and

370
00:33:07,799 --> 00:33:14,000
everything. But he was from Java
world, so I understand him. It's

371
00:33:15,720 --> 00:33:22,319
yeah, Jason, all the way. Yeah. Oh man, so no,

372
00:33:22,599 --> 00:33:25,759
thank you. Any piece of software
I've ever met that's run for ten

373
00:33:25,880 --> 00:33:30,559
years has changed thessigence decisions along the
way at some point that just that seems

374
00:33:30,599 --> 00:33:35,279
inevitable, the same way you started
in threads and then moved up to tasks,

375
00:33:36,359 --> 00:33:38,319
Like, there's got to be other
cases where you just find I have

376
00:33:38,440 --> 00:33:44,440
to change to do this. Well, now I'm trying to obstruct him far

377
00:33:44,599 --> 00:33:49,759
as much as possible, and the
foundations like threads are not going anywhere,

378
00:33:50,079 --> 00:33:53,720
so yeah, be something you can
count on. Even the netflatform itself changed

379
00:33:53,839 --> 00:34:00,599
a lot, but yeah, fire
looks the same, so yeah, your

380
00:34:00,680 --> 00:34:06,400
code's the same. What was there
any difficulty for you switching implementations or having

381
00:34:06,400 --> 00:34:09,880
implications for both the framework and for
core. The most difficult things was the

382
00:34:10,039 --> 00:34:20,079
early days of dot net core with
lack of development tools support because everything was

383
00:34:20,239 --> 00:34:28,559
changing. I mean, god coverage
tools called analysis tools and unit testing continuous.

384
00:34:30,519 --> 00:34:32,360
Well, I mean you were through
that era, coming right from twenty

385
00:34:32,440 --> 00:34:36,199
thirteen of the early days of dot
net core. Yeah, but even the

386
00:34:36,239 --> 00:34:39,000
early days of how you do CICD
pipelines like that's evolved a lot in the

387
00:34:39,079 --> 00:34:44,599
past ten years, but the concepts
are the same. Foundations are the same,

388
00:34:44,800 --> 00:34:49,760
so I think I think not so
much things changed added. A lot

389
00:34:49,840 --> 00:34:54,400
of things added, but not changed. Core concepts stay the same. Before

390
00:34:54,440 --> 00:35:00,480
we before we get off is can
you talk about job filters. That seems

391
00:35:00,519 --> 00:35:04,559
like a very powerful feature. Yeah, job builders, I think it's the

392
00:35:04,719 --> 00:35:10,400
most powerful feature from Fire. Every
extension, every paid package depends on them,

393
00:35:10,599 --> 00:35:15,679
and they allowed to extend can fire
so you can implement new things,

394
00:35:16,000 --> 00:35:23,519
more complex use cases, more integration
with application without modifying hand far and without

395
00:35:23,639 --> 00:35:32,519
rebuilding it or without using your own
version of FAR. Extensibility was one of

396
00:35:32,599 --> 00:35:39,360
the main points during the initial initial
development because it's not possible to build a

397
00:35:39,440 --> 00:35:45,880
solution that will suit everyone, and
you have to make some extension points that

398
00:35:45,000 --> 00:35:50,400
are powerful enough to make everyone happy. Yeah, very cool. So it's

399
00:35:50,440 --> 00:35:52,280
kind of like, and it says
this right here, they're kind of like

400
00:35:52,440 --> 00:35:58,320
they're similar to Aspen at NBC Action
Filters. Yes, I've tried to copy

401
00:35:58,440 --> 00:36:07,320
the concepts because their concept was already
from sp developers. Is there any flavor

402
00:36:07,360 --> 00:36:15,440
of dot net or implementation on a
particular system of dot net where certain features

403
00:36:15,559 --> 00:36:20,559
aren't available or the syntax is different
or is it just so easy that it

404
00:36:20,599 --> 00:36:23,639
works everywhere on every flavor of dot
net? Another good question. The most

405
00:36:23,679 --> 00:36:30,360
problematic one was the first version of
dot net core. Oh yeah, nobody

406
00:36:30,440 --> 00:36:34,960
uses that anymore. Yeah yeah,
yeah, but it's still supported by him

407
00:36:35,079 --> 00:36:49,519
fire. Both users really appreciate that. Okay, you're welcome if you listen,

408
00:36:49,800 --> 00:36:53,719
if you listen to us. Okay, but the net standard, a

409
00:36:53,800 --> 00:37:00,079
lot of features are resurrected. It's
a big kudos for the net developers because

410
00:37:00,639 --> 00:37:08,280
they did great job for making it
run and even feel the same on different

411
00:37:08,360 --> 00:37:15,000
platforms. In your list of features
to implement, is there anything so crazy

412
00:37:15,119 --> 00:37:20,400
that you feel like you're going to
have to take a week and go into

413
00:37:20,519 --> 00:37:24,039
a cabin and do a Ted Kazinski
somewhere and just you know, is there

414
00:37:24,079 --> 00:37:30,760
anything really on your you know,
on your implementation list that you're not looking

415
00:37:30,840 --> 00:37:36,920
forward to. I think it relates
again, different storage type support. It

416
00:37:37,679 --> 00:37:45,360
I dream implementing some kind of integration
testing for that will work for different storages,

417
00:37:45,599 --> 00:37:51,039
so you don't have to write dedicated
test suits for new storages, so

418
00:37:51,199 --> 00:37:58,280
you can just use it to test
even new storages. Some kind of acceptance

419
00:37:58,639 --> 00:38:02,480
tests. Yeah, have you ever
considered taking the database out of the picture,

420
00:38:02,599 --> 00:38:07,920
except for maybe something to persist on
the server, but you know,

421
00:38:07,079 --> 00:38:12,639
using a communication network like g r
p C or something to go directly to

422
00:38:12,760 --> 00:38:16,320
the server thing, and then the
server can just like keep a keep a

423
00:38:16,440 --> 00:38:22,840
local cache of that in case you
know, it has to reset or reboot

424
00:38:22,920 --> 00:38:30,760
or something. Moreover, there are
interesting projects available on GitHub like rocks dB.

425
00:38:30,159 --> 00:38:37,159
How do you spell that, rocks
dB, Rocks database, Rocks database,

426
00:38:37,800 --> 00:38:42,480
Rocks, rocks r O c k
S. Yeah, yeah, like

427
00:38:43,239 --> 00:38:51,960
rocks but rocks I see rocks D. Caveman used to use these for for

428
00:38:52,199 --> 00:38:57,320
keeping track of things. It's it's
an embedable database. You can add it

429
00:38:57,639 --> 00:39:05,119
to your own application. So you
can indeed build a gRPC protocol and use

430
00:39:05,239 --> 00:39:12,360
it in another high performance Okay,
so in that case you would have you'd

431
00:39:12,400 --> 00:39:19,880
have to write an abstraction over the
client and instead of hooking directly into the

432
00:39:20,000 --> 00:39:24,199
server process or whatever it is,
the server, you would put a little

433
00:39:24,199 --> 00:39:30,119
messaging between that and then you would
run the client and server, you know,

434
00:39:30,280 --> 00:39:36,000
logical server together wherever you're implementing that, I kind of get it.

435
00:39:37,079 --> 00:39:40,760
Yeah, So at the bottom line
here is it's wicked extensible. I mean,

436
00:39:40,800 --> 00:39:45,079
you've got the source for crying out
loud. You're a programmer, figure

437
00:39:45,119 --> 00:39:52,800
it out. Not you, sir, I'm talking about the listener for using

438
00:39:52,920 --> 00:39:57,760
hang fire. You're a developer.
That's what they pay you for. Okay,

439
00:39:57,800 --> 00:40:07,559
Okay, thirty years and I implement
everything but no support regress for thirty

440
00:40:07,679 --> 00:40:13,639
years and everything will be done.
So what's next for you? What are

441
00:40:13,679 --> 00:40:15,840
you going to be doing right after
you get off this call besides going to

442
00:40:15,920 --> 00:40:25,639
bed. We're going to hear tomorrow
because one of the most difficult things for

443
00:40:25,800 --> 00:40:32,159
today was to make my children sleep. Uh huh yeah, I succeeded ten

444
00:40:32,280 --> 00:40:38,800
minutes before our show. Oh great, well, well done. Yeah,

445
00:40:38,960 --> 00:40:44,960
how do you get two and five? Yes? Okay, chaos monkeys,

446
00:40:45,119 --> 00:40:50,440
chaos monkeys? Yeah, all right, Well, enjoy the wonderful foods and

447
00:40:50,639 --> 00:40:54,119
smells of Thailand and we wish you
success with hang fire, and thanks for

448
00:40:54,199 --> 00:41:00,639
talking to us. Thank you for
the invitation and for the talk speaker.

449
00:41:00,800 --> 00:41:05,719
You good questions, great, thanks, thank you, and we'll talk to

450
00:41:05,800 --> 00:41:30,159
you next time on dot net rocks. Dot net Rocks is brought to you

451
00:41:30,280 --> 00:41:35,559
by Franklin's Net and produced by Pop
Studios, a full service audio, video

452
00:41:35,679 --> 00:41:39,559
and post production facility located physically in
New London, Connecticut, and of course

453
00:41:39,639 --> 00:41:45,239
in the cloud online at pwop dot
com. Visit our website at d O

454
00:41:45,400 --> 00:41:50,400
T N E T R O c
k S dot com for RSS feeds,

455
00:41:50,719 --> 00:41:54,199
downloads, mobile apps, comments,
and access to the full archives, going

456
00:41:54,239 --> 00:41:59,559
back to show number one, recorded
in September two thousand and two. It

457
00:41:59,639 --> 00:42:02,400
makes you check out our sponsors.
They keep us in business. Now go

458
00:42:02,519 --> 00:42:07,800
write some code. See you next
time. You got tad middle vans down

459
00:42:14,280 --> 00:42:15,239
home. Then
